複数の C++ 標準ライブラリが Mac OS X 上に存在できるようになった今、かなり混沌とした状況のように見えます。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 です。