2012-06-18 12 views
8

Ho problemi a superare la fase di collegamento nel mio programma C++ a causa di problemi con Boost 1.49. Sono passato a C++ (-std=c++11 -libc=libc++) che funziona bene per un altro pezzo di codice (che utilizza anche boost). Boost è stato installato utilizzando homebrew con:Collegamento di problemi con boost :: program_options su OSX tramite LLVM

brew install boost --universal --with-mpi --with-icu 

Il problema inizia con boost::program_options. Ottengo gli errori di collegamento in questo modo:

"boost::program_options::validate(boost::any&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, int)", referenced from: 

... etc. ... 

ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Questo è un po 'strano, perché facendo un nm sulla libreria utilizzata rivela, che il simbolo sembra di essere lì:

nm -U /usr/local/lib/libboost_program_options-mt.dylib | grep validate 
0000000000019880 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPSsi 
0000000000019880 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPSsi 
00000000000199e0 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPbi 
00000000000199e0 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPbi 
0000000000019930 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPSsi 
0000000000019930 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPSsi 
0000000000019c70 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPbi 
0000000000019c70 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPbi 

Ho già provato coaxing homebrew per compilare boost con clang invece di gcc impostando CXX e CXX_FLAGS di conseguenza prima dell'installazione. Non sono sicuro di esserci riuscito.

I puntatori sono stati molto apprezzati.

+0

Stessa domanda come: http://stackoverflow.com/questions/8454329/why-cant-clang-with-libc-in-c0x-mode-link-this-boostprogram-options-examp –

risposta

8

Sarà necessario ricompilare spinta con clangore e std11 bandiere, la libC++ libreria non è compatibile a livello binario con la libstdC++ installato in OSX (versione molto precoce di gcc prima di passare a GPL3). Se la tua versione di clang è 3.1 o successiva, puoi usare (altrimenti cambia C++ 11 in C++ 0x per le versioni precedenti).

./bootstrap.sh 
mkdir build 
sudo ./bjam toolset=clang cxxflags="-std=c++0x -stdlib=libc++" variant=release link=static threading=multi runtime-link=shared --build-dir=Build --layout=system --without-mpi --without-python install --prefix=/usr/local 

Ovviamente si può modificare qualsiasi di questi come si vuole, tranne

CXXFLAGS toolset = clang = "- std = C++ 0x -stdlib = libC++"

Questo dovrebbe funzionare per voi

+0

Ciao, grazie per il puntatore. Pensato tanto. Tuttavia, non riesco a ottenere Boost per compilare le librerie dinamiche per me ora. Ho provato questo: 'sudo ./bjam toolset = clang cxxflags = "- std = C++ 11 -stdlib = libC++" variant = link di release = threading condiviso = multi runtime-link = shared --build-dir = Build --layout = system --without-mpi --without-python install --prefix =/usr/local ' ma ha ottenuto solo quelli statici. –

+1

Ho finalmente ottenuto la risposta tramite Boost.Build-Forum: http://boost.2283326.n4.nabble.com/Problems-building-Boost-with-clang-toolchain-and-C-11-td4631556.html In breve: mi mancavano i "linkflags" quando chiami bjam: ./b2 toolset = clang cxxflags = "- std = C++ 11 -stdlib = libC++" linkflags = "- stdlib = libC++" –

3

Vorrei condividere la mia esperienza (moderatamente dolorosa) di creare Boost 1.54 su Mac OS X 10.8.5 con clang 5.0.0 come fornito da Xcode 5.0. Se vuoi le funzionalità di C++ 11 è molto importante compilare e collegare con clang++, non con clang.

Illustrazione: prendere il seguente programma semplice:

#include <iostream> 
#include <string> 

int main(int argc, char *argv[]) { 
    std::string str = "OK"; 
    std::cout << str << std::endl; 
    return 0; 
} 

può essere costruito con il seguente comando:

clang++ -std=c++11 -stdlib=libc++ clangstr.cc -o clangstr

tuttavia, se si tenta questo, invece:

clang -std=c++11 -stdlib=libc++ clangstr.cc -o clangstr

allora ottieni errori di linker. Si noti che la manpage di clang dice che la lingua è selezionata dall'opzione -std=, ma questo non è chiaramente sufficiente.

La lezione è che dobbiamo dire allo di utilizzare esplicitamente clang++ durante la compilazione di Boost con supporto C++ 11.

seguito this very useful post, ho messo il seguente nel mio tools/build/v2/user-config.jam:

using clang : 11 
    : "/usr/bin/clang++" 
    : <cxxflags>"-std=c++11 -stdlib=libc++ -ftemplate-depth=512" <linkflags>"-stdlib=libc++" 
    ; 

Poi corsi ./b2 clean, poi ho costruito Boost con il seguente comando:

mkdir -p build/clangstage/ 
./b2 -j8 --build-dir=build --stagedir=build/clangstage toolset=clang-11 define=BOOST_SYSTEM_NO_DEPRECATED variant=release threading=multi address-model=64 stage 

Questo costruisce la 64 bit statica e librerie dinamiche con supporto multithreading. Se hai bisogno di un set diverso, modifica il comando sopra di conseguenza.

Problemi correlati