2015-05-11 11 views
5

Ich habe ein Projekt mit einer großen C++ - Komponente, die ich erfolgreich mit CLAM unter OSX kompilieren konnte (Apple LLVM Version 6.1.0 (clang-602.0.49)) (basierend auf LLVM 3.6.0svn .) Da OSX ein Fortran-Compiler bietet keine installiert ich gfortran über HomebrewLink OSX Homebrew Gfortran gegen libC++

Compilation funktioniert gut, aber ich kann die kompilierte Fortran-Code gegen den C früher ++ kompiliert Code nicht verknüpfen. ich erhalte den folgenden Fehler:

$ make fortran 
Undefined symbols for architecture x86_64: 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(char const*) const", referenced from: 
     DataFieldInfo::FromJSON(JSONNode const&) in [...] 
    "std::__1::__vector_base_common<true>::__throw_length_error() const", referenced from: 
     std::__1::vector<char, std::__1::allocator<char> >::allocate(unsigned long) in [...] 
     void 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> > > >::__push_back_slow_path<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> > const&) in [...] 
     void std::__1::vector<JSONNode, std::__1::allocator<JSONNode> >::__push_back_slow_path<JSONNode const>(JSONNode const&) in [...] 
[...] 

Das zeigt mir, dass ich ein Linking-Problem zwischen dem Fortran und dem C++ Teil habe.

Wie verbinde ich Fortran Teil mit libC++? Ist dies mit gfortran von Homebrew möglich? Was wäre die beste Vorgehensweise, um dieses Problem zu lösen? Sollte ich versuchen, mit clang ++ zu verknüpfen?

+0

Haben Sie '-lstdC++' versucht? –

+0

Ich musste -lC++ zum Linker hinzufügen (siehe caseys Antwort unten). – Pascal

+0

Ich vermute, dass du das vorher probiert hast ... –

Antwort

3

Sie müssen gfortran explizit mitteilen, dass es mit der C++ - Bibliothek clangs verlinkt werden soll (standardmäßig wird die GNU C++ - Bibliothek verwendet).

Zum Beispiel, wenn Sie eine Fortran und C++ Datei haben, die jeweils mit ihren jeweiligen Compiler kompiliert (Anmerkung: gfortran-mp-5 ist GNU Fortran 5.1 von Macports bereitgestellt)

gfortran-mp-5 -c gfortest.f90 
clang++ -c clangtest.cc 

Sie können die resultierenden Objekte miteinander verknüpfen mit gfortran wie folgt:

gfortran-mp-5 -lc++ -o test-f gfortest.o clangtest.o 

Die -lc++ Flag teilt gfortran in libc++ zu verknüpfen, die Ihre undefinierte Symbole lösen wird.

+0

Das sollte auch andersherum möglich sein ('clang ++ -lgfortran ... ') aber auf meinem Mac kann ich clang ++ nicht überzeugen, mit' libgfortran.3.dylib' zu verlinken (mit den richtigen '-L' und' -l' Flags. Funktioniert mit g ++, aber nicht mit clang ++ für mich). – casey

+0

Vielen Dank! Das war genau das, wonach ich suchte! – Pascal

Verwandte Themen