分析一个和依赖文件顺序有关的链接错误

makefile文件如下:

main: main.c lib/libfoo.so
    gcc -g -Wall -o main -Wl,-rpath='$$ORIGIN/lib' -L ./lib -lfoo main.c

lib/libfoo.so: lib/foo.c
    gcc -g -Wall -fPIC -shared -o lib/libfoo.so lib/foo.c

$ cat main.c
void function(void);

int main(void)
{
   function();
   return 0;
}

$ cat lib/foo.c
#include <stdio.h>

void function(void)
{
   printf("called!\n");
}

$ make
gcc -g -Wall -o main -Wl,-rpath='$ORIGIN/lib' -L ./lib -lfoo main.c
/tmp/ccBbjvLD.o: In function `main':
/home/charles/tmp/tmp/main.c:5: undefined reference to `function'
collect2: error: ld returned 1 exit status
Makefile:2: recipe for target 'main' failed
make: *** [main] Error 1

我的系统是 ubuntu 16.04(32-bit), GCC为5.4

原因在下面的这个编译命令:

gcc -g -Wall -o main -Wl,-rpath='$$ORIGIN/lib' -L ./lib -lfoo main.c

main.c依赖于 libfoo.so, 但是,main.c放在了 libfoo.so后面,所以,GCC扫描到libfoo.so后,发现这个库的接口没有被用到,

所以舍弃了这个库,等再扫到秒 main.c,就找不到了定义的 function的模块。。

把 main.c移到 -lfoo前面,就没有问题了.

改正后的 makefile:

$ cat Makefile
main: main.c lib/libfoo.so
    gcc -g -Wall -o main -Wl,-rpath='$$ORIGIN/lib'  main.c -L ./lib -lfoo

lib/libfoo.so: lib/foo.c
    gcc -g -Wall -fPIC -shared -o lib/libfoo.so lib/foo.c

https://www.technovelty.org/linux/exploring-origin.html

猜你喜欢

转载自blog.csdn.net/CaspianSea/article/details/84196969