Macos “处理”;dyld:惰性符号绑定失败:未找到符号";nm未找到符号时出错

Macos “处理”;dyld:惰性符号绑定失败:未找到符号";nm未找到符号时出错,macos,gcc,osx-mountain-lion,dylib,libstdc++,Macos,Gcc,Osx Mountain Lion,Dylib,Libstdc++,我有一个名为myBinary的fat(32位和64位)英特尔二进制文件,无法在另一台运行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/libstd

我有一个名为
myBinary
的fat(32位和64位)英特尔二进制文件,无法在另一台运行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
我从运行GCC 4.7.2的Mac OS X 10.8.2工作站编译了它:

$ gcc --version
gcc (MacPorts gcc47 4.7.2_2+universal) 4.7.2
我运行了nm,但符号未定义:

$ nm /usr/local/bin/myBinary | grep __ZNSt8__detail15_List_node_base7_M_hookEPS0_
     U __ZNSt8__detail15_List_node_base7_M_hookEPS0_

编译
myBinary
时,我遗漏了什么或做错了什么?我不确定在代码> /Ur/LIb/LIbStDc++ 6中缺少符号。DyLIB < /代码> -是否应该将C++库静态编译成<代码> MyBoodi<<代码>?

< P>每个C++编译器都有自己的标准C++库的实现。由于您使用的是外部编译器(GCC4.7),其库在Mac OS X的标准安装中不可用

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

要将库与应用捆绑在一起,请执行以下操作:

  • 使用
    install\u name\u工具更新库的安装名称

  • 确保你的应用程序在需要时找到它


  • 例如,您可以将动态库放入.app/Contents/Frameworks中,将其安装名称设置为
    @rpath
    ,并使用
    -rpath@executable\u path/./Frameworks

    是的,您有两个选项,要么不使用客户没有的库。。。(您可以将其作为dyld或框架提供。)


    或者只是静态链接库。。。如果您的软件包只有一个进程,这实际上会减少内存和磁盘空间,因为您可以去掉不使用的符号。

    在10.6上使用MacPorts GCC 4.8进行编译,然后尝试在没有MacPorts的新10.9安装上运行我的应用程序时,我遇到了同样的问题。幸运的是,我找到了你的问题,Kentzo的回答引导我朝着正确的方向去理解问题发生的原因。。。但它并没有真正提供我想要的解决方案

    首先,我将解释它在您的系统上正确运行的原因:MacPorts为您的系统提供了libstdc++版本,GCC4.7在/opt/local/lib而不是/usr/lib下为其提供符号。下面是我看到的情况(使用GCC4.8Universal):

    您可以通过
    otool-L
    查看应用程序链接到的内容:

    $ otool -L myBinary
    myBinary:
        /opt/local/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.18.0)
        /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 832.0.0)
        /opt/local/lib/libgcc/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)
    
    提高可移植性的最简单方法是在最后的gcc构建步骤(调用链接器的步骤)中使用
    -static libstdc++-static libgcc
    。您需要两者,因为动态libgcc将带来动态libstdc++绑定,所以仅仅请求静态libstdc++是不够的。对于一个简单的应用程序,下面是您的gcc行的外观:

    g++ -static-libstdc++ -static-libgcc myBinary.cpp -o myBinary
    
    但是,根据,静态链接libgcc在跨库处理异常时可能会导致问题。我没有遇到问题,但你可能会

    因此,按照Kentzo的方法,首先您应该从MacPorts获得最新的install_name_工具,这样它就不会被未知的加载命令所混淆:

    sudo port install cctools +universal
    
    现在,让我们更改路径,使其搜索可执行文件的目录:

    /opt/local/bin/install_name_tool -change /opt/local/lib/libgcc/libstdc++.6.dylib '@executable_path/libstdc++.6.dylib'
    /opt/local/bin/install_name_tool -change /opt/local/lib/libgcc/libgcc_s.1.dylib '@executable_path/libgcc_s.1.dylib'
    
    现在您只需要将这些dylib与应用程序一起分发。如果您正在制作.app,请将dylibs复制到myBinary.app/Contents/MacOS/

    最后一点注意:如果您在制作一个好的通用二进制文件时遇到困难,可以单独构建体系结构(使用不同的编译器和选项),然后将它们与以下内容合并:


    或者使用系统工具链和系统C++库,看来我的答案并不满足你。你能提供更多的细节吗?是否有另一个系统安装了GCC4.7?似乎您必须链接到非标准的libstdc++。我的副本中也没有这些符号。但在这种情况下,它实际上不应该在/usr/lib中。我可以问你为什么不使用叮当声吗?为什么从MacPorts使用gcc?为什么不至少使用苹果的gcc呢?Clang不支持我们正在使用的一些C++11特性。另外,我想确保我们的工具可以用GCC编译器构建,并了解为什么会失败,我能做些什么来解决这个问题。我用这个技术来确保我在105-8的时候有相同的C++库。当您编译自己的或使用软件包时,您需要确保lib将在您感兴趣的所有版本上运行。。。如果您支持10.5和32位,这可能会有问题。但是我认为这是绝对可能的。关于兼容性的担忧与静态链接的dyld的装运是一样的。
    /opt/local/bin/install_name_tool -change /opt/local/lib/libgcc/libstdc++.6.dylib '@executable_path/libstdc++.6.dylib'
    /opt/local/bin/install_name_tool -change /opt/local/lib/libgcc/libgcc_s.1.dylib '@executable_path/libgcc_s.1.dylib'
    
    /usr/bin/g++ -arch i686 -mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk myBinary.cpp -o myBinary_32
    /opt/local/bin/g++ -arch x86_64 -static-libstdc++ -static-libgcc myBinary.cpp -o myBinary_64
    lipo myBinary_32 myBinary_64 -create -output myBinary