2014-05-14 8 views
5

Używam MacOS X Mavericks z Xcode 5.1.1 wraz z narzędziami wiersza poleceń. Mam kompilacji prostych programów C++ z wykorzystaniem szczęk ++ dostarczonego z Xcode, info wersja: Jabłko LLVM w wersji 5.1 (dzyń-503.0.40) (oparty na LLVM 3.4svn)Domyślnie do lib = stdlibC++ dla języka ++ na Mac OS Mavericks z Xcode?

Co znajdę to, że jeśli spróbuję uruchomić następującą komendę

szczęk ++ -o hello.out hello.cpp

uzyskać następujące błędy:

Undefined symbols for architecture x86_64: 
"std::ios_base::Init::Init()", referenced from: 
___cxx_global_var_init in hello-2ad0da.o 
"std::ios_base::Init::~Init()", referenced from: 
___cxx_global_var_init in hello-2ad0da.o 
"std::cout", referenced from: 
_main in hello-2ad0da.o 
"std::basic_ostream<char, std::char_traits<char> >& std::operator<<<std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: 
_main in hello-2ad0da.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Jeśli zmienię polecenie

brzękiem ++ -o hello.out -stdlib = libstdC++ hello.cpp

ja nie otrzymuję żadnych błędów.

Czy istnieje sposób, aby "-stdlib = libstdC++" było domyślnym ustawieniem clang ++, z niektórymi ustawieniami konfiguracyjnymi lub pewną zmienną środowiskową? Ponadto, tylko w celu uzyskania informacji, dlaczego pojawia się błąd?

+0

Co to jest 'hello.cpp'? –

+1

To po prostu prosty program w C++ do drukowania "Hello, World". Mogę opublikować źródło, jeśli chcesz, ale zauważ, że działa, jeśli określę stdlibC++. Jedyna biblioteka, którą zawiera to

Odpowiedz

2

Przed OS X 10.9.x:

Domyślna był libstdc++ (za pomocą szczęk ++ -o hello.out hello.cpp) by działało.

OS X 10.9.x:

Domyślnie jest libc++ (jak wiesz, tym flagę -stdlib = libstdC++ łączy swój projekt poprawnie).

Odkąd próbujesz skompilować kod, który używa symboli, które nie mieszczą się w projektach nowszej standardowej biblioteki LLVM libc++, pojawiają się błędy. Jeśli chodzi o zmianę domyślnego że clang wykorzystuje którą prawdopodobnie musiał załatać to ToolChains.cpp(docs) z czymś takim jak:

-  DAL->AddJoinedArg(0, Opts.getOption(options::OPT_stdlib_EQ), "libc++"); 
+  DAL->AddJoinedArg(0, Opts.getOption(options::OPT_stdlib_EQ), "libstdc++"); 
3

MACOSX_DEPLOYMENT_TARGET może być to, czego szukasz.

export MACOSX_DEPLOYMENT_TARGET=10.8 powinien domyślnie ustawić clang na libstdc++ zamiast libc++.

+0

Spowodował ten błąd w moim systemie: '' 'CMake Error at /usr/local/Cellar/cmake/3.2.3/share/cmake/Modules/Platform/Darwin.cmake: 76 (komunikat): CMAKE_OSX_DEPLOYMENT_TARGET jest '10 0,8' ale CMAKE_OSX_SYSROOT: "" nie jest ustawiony na MacOSX SDK z ujętym wersji. Albo ustaw CMAKE_OSX_SYSROOT na prawidłowy zestaw SDK, albo ustaw CMAKE_OSX_DEPLOYMENT_TARGET na pusty. Stos wywołań (ostatnie połączenie w pierwszej kolejności): /usr/local/Cellar/cmake/3.2.3/share/cmake/Modules/CMakeSystemSpecificInformation.cmake:36 (włącz) CMakeLists.txt: 12 (projekt) '' ' – kilojoules

+1

@kilojoules: Powinien być sam wyjaśniający. 'export CMAKE_OSX_SYSROOT = $ (xcrun --show-sdk-path)'. – Thomas

+0

'xcrun --show-sdk-path' nic nie zwraca. Po uruchomieniu obu poleceń eksportu pojawia się ten sam komunikat o błędzie. Czy jest coś, co powinienem pobrać? – kilojoules

Powiązane problemy