- 主题:linux里边共享库也能缺symbol?
我自己编译了一个shared library, 叫libhaa.so, 里边所有的依赖都是源码整合进来编译的
编译也ok了, ldd看了一下, 只依赖几个常用的so
然后编译bb(普通app), 链接libaa.so的时候, 居然说libaa里边有找不到的函数
:-1: error: /home/mz-active/build/qtpro/../../..//lu_rc/linux64/bind/libhaa.so: undefined reference to `LZ4_compress_fast'
这就奇怪了, 1 首先是不缺, lz4已经源码整合了。
2 就算是缺, 为什么不是编译libaa的时候就报错? 要等到别人链接libaa的时候才报错?
大家有碰到类似问题的吗?
已经搞定, 说一下结果=============================================
原因是用了lz4.c和lz4hc.c lz4hc.c居然直接include了lz4.c(为了强制内联), 所以qmake解析的时候, 没有为lz4.c生成lz4.o. 问题是工程里边还有bb.c 和 hh.hpp中都引用了lz4.h, 他们没有链接到lz4的函数实现上.
最后在bb.c中直接inlude lz4.c(和lz4hc一样), 在hh.hpp中引用lz4的头文件, 居然成功了.
hh.hpp中用到了lz4函数, 应该是在bb.c中, 至于lz4hc, 不知道用了什么魔法, 将lz4.c包含后, 消化得无影无踪了。
原因后续再找. lz4 的文档好像是说,只支持静态链接,反正挺奇怪的一个思路。
--
修改:xieyf FROM 120.244.224.*
FROM 120.244.224.*
简单地说,如果aa依赖lz4(也是so的话),那你编译bb的时候需要同时指定haa和lz4依赖,而不是指定了aa之后让它自己找lz4。这是跟dll不一样的地方。
【 在 xieyf 的大作中提到: 】
: 我自己编译了一个shared library, 叫libhaa.so, 里边所有的依赖都是源码整合进来编译的
:
: 编译也ok了, ldd看了一下, 只依赖几个常用的so
:
: 然后编译bb(普通app), 链接libaa.so的时候, 居然说libaa里边有找不到的函数
:
: ..................
发自「今日水木 on SM-G9730」
--
修改:chenjy FROM 114.249.208.*
FROM 114.249.208.*
先简单nm看一下你的动态库里面有没有这个函数定义,没有的话whole-archive一下
【 在 xieyf 的大作中提到: 】
: 我自己编译了一个shared library, 叫libhaa.so, 里边所有的依赖都是源码整合进来编译的
:
: 编译也ok了, ldd看了一下, 只依赖几个常用的so
: ...................
--来自微水木3.5.11
--
FROM 36.112.207.*
编译的时候试试-lhaa -llz4都加上
如果还有问题,试试haa加载两遍行不行?
-lhaa -llz4 -lhaa这样
【 在 xieyf 的大作中提到: 】
: 我自己编译了一个shared library, 叫libhaa.so, 里边所有的依赖都是源码整合进来编译的
: 编译也ok了, ldd看了一下, 只依赖几个常用的so
: 然后编译bb(普通app), 链接libaa.so的时候, 居然说libaa里边有找不到的函数
: ...................
--
FROM 59.109.156.*
我lz4的源代码直接放到aa工程中统一编译的啊, 我用的qmake, 我怀疑qmake有些默认设置在搞鬼.
后来换了个国产make系统, 直接就过了, 没这个问题. 但是那个国产make把所有的符号表都删了.
但是删了符号表, linux里边还能链接libaa成功, 也真是nb的机制.
【 在 chenjy (cjy) 的大作中提到: 】
: 简单地说,如果aa依赖lz4(也是so的话),那你编译bb的时候需要同时指定haa和lz4依赖,而不是指定了aa之后让它自己找lz4。这是跟dll不一样的地方。
: 发自「今日水木 on SM-G9730」
--
FROM 120.244.224.*
我生成的libaa.so里边有这个函数, 但是标记是U, 我查了一下, 应该就是没找到的意思.
但是我的libaa里边明明调用了LZ4的函数的, 要是undefined reference, 怎么能编译成功?
我编译的时候, 没有连接 -llz4 专门避开系统自己的lz4, 就是为了消除依赖.
【 在 totti9848 (totti9848) 的大作中提到: 】
: 先简单nm看一下你的动态库里面有没有这个函数定义,没有的话whole-archive一下
: --来自微水木3.5.11
--
FROM 120.244.224.*
还有这种玩法?
【 在 haveidea (有一个美丽的新世界) 的大作中提到: 】
: 编译的时候试试-lhaa -llz4都加上
: 如果还有问题,试试haa加载两遍行不行?
: -lhaa -llz4 -lhaa这样
: ...................
--
FROM 120.244.224.*
你先试试看行不行。遇到过类似问题,用这个方法解决过。
【 在 xieyf 的大作中提到: 】
: 还有这种玩法?
:
--
FROM 59.109.156.*
undefined reference 只影响链接,编译时只要有足够的声明就够,而且动态链接库中的依赖不一定都要全部出现在 .so 文件里。
你这种情况很有可能是编译动态库的时候用了 lz4 的头文件(无论是系统带的还是你源码里的),链接的时候没链接到任何 lz4 的目标文件。
【 在 xieyf (绿蚁新醅酒,红泥小火炉) 的大作中提到: 】
: 我生成的libaa.so里边有这个函数, 但是标记是U, 我查了一下, 应该就是没找到的意思.
: 但是我的libaa里边明明调用了LZ4的函数的, 要是undefined reference, 怎么能编译成功?
: 我编译的时候, 没有连接 -llz4 专门避开系统自己的lz4, 就是为了消除依赖.
: ...................
--
FROM 103.90.178.*
刚才不是说了,就是你这个函数没有打包进去最后的动态库,编译的时候把你用的额外的库拿--whole-archive包一下。
【 在 xieyf 的大作中提到: 】
: 我生成的libaa.so里边有这个函数, 但是标记是U, 我查了一下, 应该就是没找到的意思.
:
: 但是我的libaa里边明明调用了LZ4的函数的, 要是undefined reference, 怎么能编译成功?
: ...................
--来自微水木3.5.11
--
FROM 111.197.237.*