【问题标题】:undefined symbol in shared library共享库中未定义的符号
【发布时间】:2016-10-16 12:00:51
【问题描述】:

我在 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)

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

【问题讨论】:

  • 因为,它可能需要链接另一个库作为先决条件。
  • 如果它需要另一个库。我认为它应该在编译时产生错误

标签: linux gcc g++ shared-libraries


【解决方案1】:

默认情况下,编译和链接共享库不会报告未定义的符号。

它们会在您生成可执行文件时报告,所有符号都必须在其中定义。

如果你想强制 停止你的 lib 构建并给你错误,你必须启用 --no-undefined 选项。

【讨论】:

  • 我认为是-Wl,--no-undefined,因为您指的是gcc。 --no-undefined 适用于 ld然而。只是为了避免混淆......
  • -Wl,--no-undefined 似乎无法正确处理弱符号(visibility=hidden)
猜你喜欢
  • 2011-02-28
  • 2018-04-14
  • 2021-08-20
  • 1970-01-01
  • 2011-07-19
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多