Połącz różne standardowe biblioteki C ++ w systemie Mac OS X
Teraz, gdy w systemie Mac OS X może istnieć wiele standardowych bibliotek C ++, wygląda to na dość chaotyczną sytuację. Wedłughttps://stackoverflow.com/a/8457799/1772681, mieszanie libstdc ++ i libc ++ spowoduje błąd łącza, który wychwytuje taką niebezpieczną sytuację i jest dobrą rzeczą.
Z drugiej strony, są jeszcze 2 sytuacje, które wymagają więcej badań, i stworzyłem kilka przypadków testowych na ten temat w github gist (https://gist.github.com/manphiz/7195515). Potwierdza, że miksowanie dynamicznych bibliotek, które łączą się z libstdc ++ (z systemu lub waniliowego GNU GCC) i libc ++ (system) spowoduje błąd łącza. Jednakże, jeśli jedna dynamiczna biblioteka łączy się z systemem libstdc ++, podczas gdy inna dynamiczna biblioteka łączy się z waniliowym GNU GCC libstdc ++, a następnie łączy się również z binarnym, działa również i dla mojego prostego przypadku testowego działa nawet w czasie wykonywania.
$ 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
Więc tutaj potrzebna jest rada:
Czy możemy miksować system libstdc ++ i ręcznie budować GNU GCC libstdc ++? Jeśli nie, kiedy spowoduje kłopoty?Czy możemy wymieszać system libc ++ i ręcznie zbudować Clang libc ++? Jeśli nie, kiedy spowoduje kłopoty?Informacje o kompilatorach:
$ 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)
System to Mac OS X 10.9.