2014-11-16 7 views
14

Mi scuso per aver posto una domanda così comune; Non riesco a trovare nessuna soluzione là fuori che funzioni o sia abbastanza chiara per me da implementare. Sto semplicemente cercando di installare mgiza. Ecco il file INSTALL:Ancora un problema "ld: symbol (s) not found for architecture x86_64" con boost, questa volta con mgiza

cmake . 
make 
make install 

If you want to install to a custom location, add the following flag when you run cmake: 
-DCMAKE_INSTALL_PREFIX=/path/to/custom/location 

NOTE: Boost Version 1.48 has problem with the code, you can use either 1.46 or 1.50+. Unfortunately 1.48 is shipped with Ubuntu 12.04 LTS, you can either download and compile libboost 1.50+ from their website, or just do this: 
sudo apt-get install libboost1.46-all-dev 

Sembra facile, giusto? Digitando cmake . funziona senza problemi apparenti. Sfortunatamente, make viene eseguito con questo errore temuto ("simboli non definiti ...") con boost.

1 warning generated. 
Linking CXX executable ../bin/d4norm 
Undefined symbols for architecture x86_64: 
    "std::string::_Rep::_M_destroy(std::allocator<char> const&)", referenced from: 
     boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o) 
    "std::string::_Rep::_S_empty_rep_storage", referenced from: 
     boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o) 
    "std::string::assign(char const*, unsigned long)", referenced from: 
     boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o) 
    "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from: 
     boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o) 
    "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)", referenced from: 
     boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o) 
    "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from: 
     boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Sulla base di altre domande, si tratta di un problema con Mavericks perché utilizza clang per compilare codice C++, il che implica che la biblioteca è libC++, non libstdC++. Per completezza, e in modo che altri possano riprodurre i miei errori, sto usando OS X 10.9.5, Xcode 6.1, e la mia versione boost è 1.56 (boost è stato installato via homebrew).

Ora, ci deve essere un po 'di risolvere là fuori, giusto? Andiamo attraverso alcuni di loro:

  1. Applying the -m32 flag: non applicabile perché il Makefile non ha alcun "g ++" in esso, e anche mi dice in modo esplicito di NON modificarlo, perché è un "cmake" file generato.
  2. Not defining something in a header file: non applicabile perché il codice deve essere pronto per essere compilato.
  3. Adding -stdlib=libstdc++ to linker: Non sono sicuro di come aggiungerlo a un comando make? Ho provato solo a fare make -stdlib=libstdc++ e mentre ciò sembrava evitare gli errori di cui sopra, ha introdotto alcuni errori aggiuntivi: make: *** [all] Error 2 (non è sicuro che cosa significa).
  4. Linking to proper boost libraries: C'è un commento che dice "Devi solo collegarti alle librerie di boost appropriate ... un sacco di Q/As su come farlo". Sfortunatamente, non penso che nessuna delle domande che il commentatore ha collegato per risolvere il mio problema.
  5. Linking Qt with boost: Non penso che sia applicabile perché non sto utilizzando Qt e non so dove inserirò una riga LIBS += [...] boost.
  6. Linking a missing file: Questo problema sembra essere più relativo al collegamento durante l'esecuzione di g++ ma sto utilizzando un Makefile che non dispone di g++ da nessuna parte.
  7. Using g++ vs gcc: Non so come posso cambiare, che di questi io uso, perché sto utilizzando cmake e make ...
  8. Changing a link command: Ancora una volta, non so come posso cambiare la compilazione da cmake/make a gcc. (Nota: da questo punto in poi, ignorerò la maggior parte delle domande a cui viene data risposta aggiungendo qualcosa a gcc o g ++.)
  9. Changing the standard c++ library: la soluzione prevede l'ingresso in Xcode e la modifica delle librerie. Non penso che questo sia l'approccio corretto e, in ogni caso, probabilmente avrei rovinato qualcosa se avessi cambiato un'impostazione in Xcode (non ho nemmeno esperienza con la GUI di Xcode).
  10. Linking libraries in Xcode: Penso che questo sia un caso simile al n. 9 in questa lista. La risposta qui suggerisce anche di usare homebrew invece di macports per installare boost, ma ho già detto in precedenza che ho usato homebrew per installare boost.
  11. Compile with clang: un problema simile, ma come faccio a ottenere cmake o make per compilare con clang?
  12. From a (popular) bitcoin issue: Ora questo sembra interessante! Un sacco di persone hanno incontrato il mio errore. Sfortunatamente, sembra non esserci consenso o soluzione facile. Ci sono anche alcune soluzioni che non so implementare. Ad esempio, una soluzione di "imbolo" consiste nel compilare boost usando un flag cxxflag, ma cosa significa?

Quindi sono in un po 'di una perdita su come installare correttamente mgiza ... voglio dire, il punto di mgiza darmi cmake e make è così che io non deve preoccuparsi dei dettagli disordinati di compilare le cose, giusto? Questo non è solo un problema con mgiza, tuttavia, poiché ho riscontrato questo problema quando provavo a fare make altrove. Comprendo le idee di alto livello dei Makefile (C), ma non i dettagli di basso livello.

+0

try 'cmake -DCMAKE_C_COMPILER = clang -DCMAKE_CXX_COMPILER = clang ++ .' – zaufi

+0

Grazie, ma mentre sembra forzare l'uso di clang e clang ++, ho finito per ottenere questo errore seguendo' make':/bin/sh: $ HOME/mgiza/mgizapp/clang ++: Nessun file o directory di questo tipo. Succede letteralmente subito dopo l'avvio di 'make'. – ComputerScientist

+0

quindi, provare i percorsi assoluti per clang compilatore (non so dove si trova effettivamente in OSX) – zaufi

risposta

2

Per risolvere alcuni dei dubbi dei commentatori: il modo migliore per risolvere questo problema è provare a svuotare il più possibile il sistema e avviare il processo da zero.

Inoltre, dal momento che questo è stato pubblicato, è stato rilasciato OS X 10.10 Yosemite, che potrebbe aver risolto questo problema (IIRC questo problema è dovuto principalmente a 10.9 e modifiche al compilatore clang/gcc).

Problemi correlati