最近在测试编译个程序的时候发现无论如何都没法正常编译,命令行是这样的:
gcc -I../../include/ -L../../lib -lVU -lfftw3f -lvsip -lfftw -lfftw3f -lrfftw conv1dEx.c
一直报链接错误,但是库文件名字和路径都指定了的(-L -l),我甚至把那些.a的静态库ar x全部解开,然后nm去遍历.o文件包含的符号了,函数确实是有的,但就是报未定义。
晚上有点时间再次测试了一下,发现我自己用法有问题:
gcc -I../../include/ -L../../lib ./conv1dEx.c -lVU -lfftw3f -lvsip -lfftw -lfftw3f -lrfftw
这么写就对了,原因是在上一篇总结的文章中找到。
https://www.cdsy.xyz/computer/programme/gcc/230713/cd44656.html
连接器在链接过程中,对搜索的库,只会做一次扫描,排在本静态库(动态库好像也是这样)前面的目标文件(或者库文件中)中如果含有未定义的符号在本静态库中找到,那么连接器会把对应的.o文件链接进来,但是如果在本静态库后面的目标文件中有未定义的符号在本静态库中找到,那么本静态库包含的对应.o文件是不会被链接的。所以看来静态库这种这个顺序还挺重要啊。
ld的man里面还说可以用-(来让ld多次搜索库里面的符号,暂时没找到如何传给ld。后面找到再补吧。