- 主题:linux里边共享库也能缺symbol?
我可以举个说明我的观点的例子。这里 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.*
编译libhaa.so的时候加上 -Wl,--no-undefined 可破
【 在 xieyf (绿蚁新醅酒,红泥小火炉) 的大作中提到: 】
: 我自己编译了一个shared library, 叫libhaa.so, 里边所有的依赖都是源码整合进来编译的
: 编译也ok了, ldd看了一下, 只依赖几个常用的so
: 然后编译bb(普通app), 链接libaa.so的时候, 居然说libaa里边有找不到的函数
: ...................
--
FROM 116.213.168.*
真有用,搞定
【 在 kirbyzhou (下雪 你那边下雪了么?) 的大作中提到: 】
: 编译libhaa.so的时候加上 -Wl,--no-undefined 可破
--
FROM 120.244.224.*
我试了一下, 是这个原因。
【 在 ArchLinux (a lightweight and flexible distribution) 的大作中提到: 】
: 我可以举个说明我的观点的例子。这里 test.c 引用了不知道来自哪里的符号 my_puts, 但是仍然可以构建出 test.so. 只要在链接时在 test.so 之前定义了这个符号,就可以链接成功并产生可运行的可执行文件。
: gcc -shared -o test.so test.c
: gcc -o main main.c test.so
: ...................
--
FROM 120.244.224.*
搞定了, 谢谢大家!
【 在 xieyf (绿蚁新醅酒,红泥小火炉) 的大作中提到: 】
: 我自己编译了一个shared library, 叫libhaa.so, 里边所有的依赖都是源码整合进来编译的
: 编译也ok了, ldd看了一下, 只依赖几个常用的so
: 然后编译bb(普通app), 链接libaa.so的时候, 居然说libaa里边有找不到的函数
: ...................
--
FROM 120.244.224.*