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