在 Mac OS X 上链接不同的C++标准库
Link different C++ standard libraries on Mac OS X
现在Mac OS X上可以存在多个C++标准库,现在看起来情况相当混乱。根据 https://stackoverflow.com/a/8457799/1772681 的说法,混合libstdc++和libc++会导致链接错误,这抓住了这种危险的情况,是一件好事。
另一方面,仍有 2 种情况需要更多调查,我在 github gist (https://gist.github.com/manphiz/7195515) 中为此创建了一些测试用例。它确认混合链接到libstdc++(来自系统或原版GNU GCC)和libc++(系统)的动态库将导致链接错误。但是,如果一个动态库链接到系统 libstdc++,而另一个动态库链接到原版 GNU GCC libstdc++,然后将两者链接到二进制文件中也可以工作,对于我的简单测试用例,它甚至可以在运行时工作。
$ make -f Makefile.system_gnu
g++-4.8 -g -Wall -fPIC -o main.o -c main.cc
g++-4.8 -g -Wall -fPIC -o test_a.o -c test_a.cc
g++-4.8 -dynamiclib -o libtest_a.dylib test_a.o
clang++ -g -Wall -fPIC "-stdlib=libstdc++" -o test_b.o -c test_b.cc
clang++ -dynamiclib "-stdlib=libstdc++" -o libtest_b.dylib test_b.o
g++-4.8 -o test main.o -L. -ltest_a -ltest_b
$ ./test
main_test_a_test_b
所以这里需要建议:
- 我们可以混合系统libstdc++和手动构建的GNU GCC libstdc++吗?如果没有,什么时候会引起麻烦?
- 我们可以混合系统libc++和手动构建的Clang libc++吗?如果没有,什么时候会引起麻烦?
编译器信息:
$ clang -v
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix
$ gcc-4.8 -v
Using built-in specs.
COLLECT_GCC=gcc-4.8
COLLECT_LTO_WRAPPER=/opt/homebrew/Cellar/gcc48/4.8.2/libexec/gcc/x86_64-apple-darwin13.0.0/4.8.2/lto-wrapper
Target: x86_64-apple-darwin13.0.0
Configured with: ../configure --build=x86_64-apple-darwin13.0.0 --prefix=/opt/homebrew/Cellar/gcc48/4.8.2 --enable-languages=c,c++,fortran,java,objc,obj-c++ --program-suffix=-4.8 --with-gmp=/opt/homebrew/opt/gmp4 --with-mpfr=/opt/homebrew/opt/mpfr2 --with-mpc=/opt/homebrew/opt/libmpc08 --with-cloog=/opt/homebrew/opt/cloog018 --with-isl=/opt/homebrew/opt/isl011 --with-system-zlib --enable-version-specific-runtime-libs --enable-libstdcxx-time=yes --enable-stage1-checking --enable-checking=release --enable-lto --disable-werror --enable-plugin --disable-nls --with-ecj-jar=/opt/homebrew/opt/ecj/share/java/ecj.jar --enable-multilib
Thread model: posix
gcc version 4.8.2 (GCC)
系统是 Mac OS X 10.9。
我不代表苹果,但观察他们的行动,我相信他们的目标是回到 Mac OS(和 iOS)的一个标准库实现——那就是 libc++。我相信在未来的某个时候,libstdc++将不再是Mac OS X的一部分。
我们可以混合系统libc++和手动构建的Clang libc++吗?如果没有,什么时候会引起麻烦?
我经常这样做 - 但我不会替换 usr/lib 中的那个。相反,我在设置环境变量DYLD_LIBRARY_PATH指向我新构建的libc ++后运行特定的程序。替换/usr/lib 中的那个可能会使您的系统变砖。(如果您在 dylib 中破坏了某些东西 - 甚至只是更改std::string
的布局,例如)。
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- 标准是否严格定义了该程序应该如何编译?
- 如何从Windows应用程序输出到标准?
- 安全到标准:移动会员?
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 这是否符合C++标准:双响双响,例如!!(-0.0).
- 标准::变体的赋值运算符
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 并行标准::复制复杂性