我试图在我的项目中使用ATLAS,但我无法将最简单的代码链接到它:
#include <stdio.h>
#include <cblas.h>
void ATL_buildinfo(void);
int main() {
ATL_buildinfo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在编译:
gcc -I/home/caian/ATLAS/include/ \
-I/home/caian/ATLAS/ARCH/include/ \
-L/home/caian/ATLAS/ARCH/lib/ \
-latlas main.c -o test
Run Code Online (Sandbox Code Playgroud)
我仔细检查了ATL_buildinfo原型和libatlas.a,nm显示ATL_buildinfo存在.
可能是什么问题呢?
在链接器标志之前移动main.c可以解决它.
$gcc main.c -I..-L...".
Run Code Online (Sandbox Code Playgroud)
这应该可以解决问题.
这是有效的,因为gnu链接器强加了"链接顺序".
链接器的传统行为是在命令行中指定的库中从左到右搜索外部函数.这意味着包含函数定义的库应该出现在使用它的任何源文件或目标文件之后.这包括使用short-cut -l选项指定的库,如以下命令所示.
$ gcc -Wall calc.c -lm -o calc (correct order)
Run Code Online (Sandbox Code Playgroud)
此链接解释了此行为:
http://chara.epfl.ch/~fsalvi/docs/gcc/www.network-theory.co.uk/docs/gccintro/gccintro_17.html