共享库中的未定义符号

6

我在Linux系统中编译了一个共享库。在生成该库后,我执行ldd -r libfoo.so命令时,出现了未定义符号错误

我的错误信息如下:

ldd -r libcaffe.so
   linux-vdso.so.1 =>  (0x00007fffdd541000)
   /opt/alisentry/$LIB/alisentry_connect.so =>         
   /opt/alisentry/lib64/alisentry_connect.so (0x00007ff8777bc000)
   /opt/alisentry/$LIB/alisentry_exec.so =>    
   /opt/alisentry/lib64/alisentry_exec.so (0x00007ff8775b8000)
   /opt/alisentry/$LIB/alisentry_kill.so => 
   ...
   libc.so.6 => /lib64/libc.so.6 (0x00007ff876291000)
   /lib64/ld-linux-x86-64.so.2 (0x0000003671800000)
undefined symbol:  
       _ZN2cv12mulSpectrumsERKNS_11_InputArrayES2_RKNS_12_OutputArrayEi
       (./libcaffe.so)
undefined symbol: _ZN2cv17getOptimalDFTSizeEi    (./libcaffe.so)
undefined symbol: _ZN2cv3dftERKNS_11_InputArrayERKNS_12_OutputArrayEii    (./libcaffe.so)

我的问题是,共享库已经完成了编译和链接。为什么它仍然有未定义的符号,为什么这不会发生在链接阶段?

1
由于可能需要另一个库作为前提条件链接,因此需要进行修改。 - LPs
1
如果需要另一个库,我认为在编译时应该会生成错误。 - Samuel
1个回答

9
编译和链接共享库默认不会报告未定义符号。只有在生成可执行文件时,所有符号都必须被定义才会报告它们。如果您想强制停止库构建并给出错误信息,则需要启用--no-undefined选项。

2
我认为你指的是gcc编译器的选项-Wl,--no-undefined。然而,--no-undefined适用于ld链接器。只是为了避免混淆... - flederwiesel
-Wl,--no-undefined 似乎无法正确处理弱符号(可见性=隐藏)。 - atomsymbol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接