我在使用 MacPorts GCC 4.8 编译 10.6 时遇到了同样的问题,然后尝试在没有 MacPorts 的全新 10.9 安装上运行我的应用程序。幸运的是,我找到了您的问题,而 Kentzo 的回答将我引向了正确的方向,说明问题发生的原因……但它并没有真正提供我正在寻找的解决方案。
首先,我将解释为什么它可以在您的系统上正确运行:MacPorts 为您的系统提供了 GCC 4.7 为其提供符号的 libstdc++ 版本,位于 /opt/local/lib 而不是 /usr/lib 下。这对我来说是这样的(使用 GCC 4.8 通用):
$ find /opt/local/lib -name 'libstdc++.*'
/opt/local/lib/gcc48/i386/libstdc++.6.dylib
/opt/local/lib/gcc48/i386/libstdc++.a
/opt/local/lib/gcc48/i386/libstdc++.a-gdb.py
/opt/local/lib/gcc48/i386/libstdc++.dylib
/opt/local/lib/gcc48/i386/libstdc++.la
/opt/local/lib/gcc48/libstdc++.6.dylib
/opt/local/lib/gcc48/libstdc++.a
/opt/local/lib/gcc48/libstdc++.a-gdb.py
/opt/local/lib/gcc48/libstdc++.dylib
/opt/local/lib/gcc48/libstdc++.la
/opt/local/lib/libgcc/libstdc++.6.dylib
/opt/local/lib/libstdc++.6.dylib
您可以看到您的应用程序链接到的内容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)
提高可移植性的最简单方法是-static-libstdc++ -static-libgcc
在最后的 gcc 构建步骤(调用链接器的步骤)中。您需要两者,因为动态 libgcc 将带来动态 libstdc++ 绑定,因此仅请求静态 libstdc++ 是不够的。对于一个简单的应用程序,您的 gcc 行可能如下所示:
g++ -static-libstdc++ -static-libgcc myBinary.cpp -o myBinary
但是,根据关于链接器选项的 gcc 手册页,静态链接 libgcc 可能会在跨库处理异常时导致问题。我没有遇到问题,但你可能会。
因此,要按照 Kentzo 的方式进行操作,首先您应该从 MacPorts 获取最新的 install_name_tool,这样它就不会被未知的加载命令混淆:
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,请将 dylib 复制到 myBinary.app/Contents/MacOS/。
最后一点:如果您在制作良好的通用二进制文件时遇到问题,可以单独构建架构(使用不同的编译器和选项),然后将它们与lipo合并:
/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