【问题标题】:ld reports missing symbols, but symbols seem to existld 报告缺少符号,但符号似乎存在
【发布时间】:2011-02-02 09:10:54
【问题描述】:

我正在尝试将我的 mac 应用程序链接到美妙的 libancillary 库。但是,我已更改库构建脚本以创建共享库。我可以使用nm libancillary.dylib 检查这个库中的符号 - 结果是:

libancillary.dylib(single module):
         U ___sF
         U __keymgr_get_and_lock_processwide_ptr
         U __keymgr_get_and_lock_processwide_ptr_2
         U __keymgr_set_and_unlock_processwide_ptr
         U _abort
00002cfe T _ancil_recv_fd
00002c87 T _ancil_recv_fds
00002b6a T _ancil_recv_fds_with_buffer
00002e9e T _ancil_send_fd
00002e27 T _ancil_send_fds
00002d3f T _ancil_send_fds_with_buffer
         U _calloc
         U _dlopen
         U _dlsym
         U _fflush
         U _fprintf
         U _free
         U _malloc
         U _recvmsg
         U _sendmsg

但是,当我尝试链接我的应用程序时,我得到的输出是:

g++ -headerpad_max_install_names -framework AppKit -framework Cocoa -framework IOKit -framework CoreFoundation -framework Carbon -framework OpenGL -framework SystemConfiguration -framework Security -Wl,-bind_at_load -arch i386 -o MyApp build/app.o build/client.o build/util.o -F/Library/Frameworks -L/Library/Frameworks -L../ancillary -lancillary
Undefined symbols:
  "ancil_recv_fd(int, int*)", referenced from:
      CIPCUnixUtils::readFD(int, int&) constin utils.o
  "ancil_send_fd(int, int)", referenced from:
      CIPCUnixUtils::writeFD(int, int) constin utils.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [ABClient] Error 1

(我稍作编辑以删除很长的目标文件列表)。

什么可能导致此链接失败?该符号存在,并且是公共的,并且没有关于无法找到库的错误或任何其他错误消息。

【问题讨论】:

  • 这里有类似的问题:stackoverflow.com/questions/942754/… 除了我的符号显示为公开。
  • 与 linux 相比,您不必使用 nm -D 来查看动态链接的符号,还是在 osx 上的工作方式有所不同?

标签: c++ macos gcc linker undefined-symbol


【解决方案1】:

这些符号是未损坏的 C 符号。由于您已将其标记为 C++,因此我假设您正在使用 C++ 进行编译。如果这样做,您可能需要将库头文件包装在代码中的外部块中:

extern "C" {
#include "library.h"
}

其中 library.h 是库的头文件的名称,以防止它们在调用代码中被破坏。

【讨论】:

  • Doh - 我应该想到这一点。谢谢。
【解决方案2】:

我想知道这是否是 C++ 名称修改问题?

尝试在utils.o 文件上运行nm,看看它实际在寻找什么符号。

您可能必须将标头包装在 extern C 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 2018-01-05
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 2018-09-05
    • 2011-01-06
    • 1970-01-01
    相关资源
    最近更新 更多