当nm找不到符号时,处理"dyld:惰性符号绑定失败:未找到符号"错误

Ale*_*lds 8 macos gcc dylib libstdc++ osx-mountain-lion

我有一个胖(32位和64位)英特尔二进制文件myBinary,无法在运行Mac OS X 10.8.2的另一个工作站上运行:

$ myBinary
dyld: lazy symbol binding failed: Symbol not found: __ZNSt8__detail15_List_node_base7_M_hookEPS0_
  Referenced from: /usr/local/bin/myBinary
  Expected in: /usr/lib/libstdc++.6.dylib

dyld: Symbol not found: __ZNSt8__detail15_List_node_base7_M_hookEPS0_
  Referenced from: /usr/local/bin/myBinary
  Expected in: /usr/lib/libstdc++.6.dylib

Trace/BPT trap: 5
Run Code Online (Sandbox Code Playgroud)

我是从运行GCC 4.7.2的Mac OS X 10.8.2工作站编译的:

$ gcc --version
gcc (MacPorts gcc47 4.7.2_2+universal) 4.7.2
Run Code Online (Sandbox Code Playgroud)

我跑nm了,符号未定义:

$ nm /usr/local/bin/myBinary | grep __ZNSt8__detail15_List_node_base7_M_hookEPS0_
     U __ZNSt8__detail15_List_node_base7_M_hookEPS0_
Run Code Online (Sandbox Code Playgroud)

编译时我错过了什么或做错了什么myBinary?我不知道我能做些什么来丢失符号/usr/lib/libstdc++.6.dylib- 我应该将C++库静态编译成myBinary

Ken*_*tzo 1

每个 C++ 编译器都有自己的标准 C++ 库实现。由于您使用的是外部编译器 (GCC 4.7),因此它的库在 Mac OS X 的标准安装中不可用。

您唯一的选择是将库捆绑在您的应用程序中或静态链接它。

要将库与应用程序捆绑在一起:

  1. 使用更新库的安装名称install_name_tool

  2. 确保您的应用程序在需要时能够找到它

例如,您可以将 dylib 放入 .app/Contents/Frameworks 中,将其安装名称设置为@rpath并使用-rpath @executable_path/../Frameworks.