2

我试图在我的项目中使用 ATLAS,但我什至无法将最简单的代码与之链接:

#include <stdio.h>
#include <cblas.h>

void ATL_buildinfo(void);

int main() {
    ATL_buildinfo();
    return 0;
}

我正在编译:

gcc -I/home/caian/ATLAS/include/ \
  -I/home/caian/ATLAS/ARCH/include/ \
  -L/home/caian/ATLAS/ARCH/lib/ \
  -latlas main.c -o test

我仔细检查了 ATL_buildinfo 原型和 libatlas.a,nm 显示 ATL_buildinfo 存在。

可能是什么问题呢?

4

1 回答 1

5

在链接器标志之前移动 main.c 可能会解决它。

$gcc main.c -I..-L...".  

这应该可以解决问题。

这是因为 gnu 链接器强加“链接顺序”的方式。

链接器的传统行为是在命令行指定的库中从左到右搜索外部函数。这意味着包含函数定义的库应该出现在使用它的任何源文件或目标文件之后。这包括使用快捷方式 -l 选项指定的库,如以下命令所示。

$ gcc -Wall calc.c -lm -o calc   (correct order)

此链接解释了这种行为:

http://chara.epfl.ch/~fsalvi/docs/gcc/www.network-theory.co.uk/docs/gccintro/gccintro_17.html

于 2012-07-10T14:49:54.023 回答