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?
每个 C++ 编译器都有自己的标准 C++ 库实现。由于您使用的是外部编译器 (GCC 4.7),因此它的库在 Mac OS X 的标准安装中不可用。
您唯一的选择是将库捆绑在您的应用程序中或静态链接它。
要将库与应用程序捆绑在一起:
使用更新库的安装名称install_name_tool
确保您的应用程序在需要时能够找到它
例如,您可以将 dylib 放入 .app/Contents/Frameworks 中,将其安装名称设置为@rpath并使用-rpath @executable_path/../Frameworks.