我可以举个说明我的观点的例子。这里 test.c 引用了不知道来自哪里的符号 my_puts, 但是仍然可以构建出 test.so. 只要在链接时在 test.so 之前定义了这个符号,就可以链接成功并产生可运行的可执行文件。
gcc -shared -o test.so test.c
gcc -o main main.c test.so
LD_LIBRARY_PATH=. ./main
// test.c
int my_puts(const char *s);
void test()
{
my_puts("hello");
}
// main.c
#include <stdio.h>
int my_puts(const char *s)
{
return puts(s);
}
void test();
int main()
{
test();
return 0;
}
【 在 ArchLinux (a lightweight and flexible distribution) 的大作中提到: 】
: undefined reference 只影响链接,编译时只要有足够的声明就够,而且动态链接库中的依赖不一定都要全部出现在 .so 文件里。
: 你这种情况很有可能是编译动态库的时候用了 lz4 的头文件(无论是系统带的还是你源码里的),链接的时候没链接到任何 lz4 的目标文件。
--
FROM 103.90.178.*