2017-10-25 4 views
2

Ich habe eine Bibliothek, die in einer Mischung aus Fortran und C++ geschrieben ist. Es verwendet auch MPI auf der Fortran-Ebene. Angenommen, ein Benutzer möchte ein neues C++ - Programm mit meiner Bibliothek verknüpfen. Von dem, was ich im Internet gefunden habe, ist der beste Weg, dies zu tun, sie ihren Code mit einem C++ - Compiler kompilieren zu lassen und mit dem mpif90 fortran-Wrapper eine Verbindung zu meiner Bibliothek herzustellen. Dies ist, um sicherzustellen, dass Sie mit der richtigen Version von MPI verknüpfen. Aber damit das alles funktioniert, müssen Sie auch explizit gegen libC++ verlinken, weil sonst Ihr C++ Programm nicht funktioniert. So zum Beispiel:Verknüpfung mit der richtigen libC++ mit Xcode 9.0

mpic++ their_code.cc -c 
mpif90 their_code.o -o program.exe -lmylib -lstdc++ 

Dieser Ansatz war für mich hat gut funktioniert auf vielen verschiedenen Plattformen und Compiler (Gnu, Intel, etc.). Es funktionierte auch für clang, bis zur Veröffentlichung von Xcode 9.0, die diesen Prozess durchbrach. Die Compilerfehler scheinen mit der Inkompatibilität in der C++ - Standardbibliothek in Zusammenhang zu stehen, weil sie nur bricht, wenn ich Funktionen aufruft, die std :: string übergeben. Im Xcode release notes heißt es:

Projects created using this Xcode release use the new libc++ implementation of the standard C++ library. The libc++ library is available only on iOS 5.0 and later and OS X 10.7 and later. 12221787

To enable deployment on earlier releases of iOS and OS X in your project, set the C++ Standard Library build setting to libstdc++ (Gnu C++ standard library).

Dies führt mich Ich brauche zu ändern, zu glauben, wie ich gegen libC++ verknüpfen. Sie können dieses Problem mit dem folgenden Code reproduzieren (vorausgesetzt, Sie haben Xcode auf Version 9 aktualisiert).

main.cc:

#include<string> 
using namespace std; 

void fun_str(string s); 
void fun_num(int n); 

int main() { 
    string my_str = "test"; 
    int my_num = 1; 
    fun_str(my_str); 
    fun_num(my_num); 
    return 0; 
} 

fun.cc:

#include <string> 
using namespace std; 

void fun_str(string s) {} 

void fun_num(int n) {} 

Makefile:

test: main.o fun.o 
    mpif90 main.o fun.o -o program.exe -lstdc++ 

main.o: main.cc 
    mpic++ main.cc -c 

fun.o: fun.cc 
    mpic++ fun.cc -c 

Beachten Sie, wie wenn Sie alle Verweise auf Zeichenketten entfernen, es richtig funktioniert kompilieren . Aber wenn nicht, erhalten Sie die folgende Fehlermeldung:

mpic++ main.cc -c 
mpic++ fun.cc -c 
mpif90 main.o fun.o -o program.exe -lstdc++ 
Undefined symbols for architecture x86_64: 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long)", referenced from: 
     _main in main.o 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from: 
     _main in main.o 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from: 
     _main in main.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 
make: *** [test] Error 1 

Außerdem, wenn Sie auf GNU wechseln, indem Sie die Umgebungsvariable OMPI_CXX Einstellung g ++ - 7, kompiliert es auch ohne Probleme. Das ist definitiv nur ein Clang-Problem, das nur in der neuen Version auftauchte. Jede Hilfe würde sehr geschätzt werden :)!

Antwort

1

Ich habe das selbst behoben, aber mit -lC++ anstelle von -lstdC++. Es scheint, dass libstdC++ is depreciated mit clang.

Verwandte Themen