2017-08-23 3 views
0

für den Arbeitszweck Ich muss eine gemeinsam genutzte Bibliothek aus einer Modelica-Datei (. Mo) erzeugen und in Matlab laden. Aber aus irgendwelchen Gründen verwendet Matlab eine andere Version von libstdC++ - 6, die einen Konflikt mit dem von meiner gemeinsamen Bibliothek benötigten verursacht.Mingw statische Verbindung libstdC++

Hier ist die Befehlszeile, die ich verwende, um meine .o-Dateien zu generieren. Die .mo-Datei wurde zuvor in c-Dateien umgewandelt.

gcc -falign-functions -msse2 -mfpmath=sse -Iinclude/ -Iinclude/fmi1 -I. -DOMC_MODEL_PREFIX=GENROU -DOMC_NUM_MIXED_SYSTEMS=0 -DOMC_NUM_LINEAR_SYSTEMS=0 -DOMC_NUM_NONLINEAR_SYSTEMS=0 -DOMC_NDELAY_EXPRESSIONS=0 -DOMC_NVAR_STRING=0 -c -o GENROU.o GENROU.c 

Ein Bündel von .o Dateien genereted und aus Gründen der Kürze werden werde ich die anderen ommit, die genau die gleichen sind.

Und hier sind die problematische Befehlszeile

g++ -shared -I. -o GENROU.dll GENROU_FMU.o GENROU.o GENROU_functions.o GENROU_records.o GENROU_01exo.o GENROU_02nls.o GENROU_03lsy.o GENROU_04set.o GENROU_05evt.o GENROU_06inz.o GENROU_07dly.o GENROU_08bnd.o GENROU_09alg.o GENROU_10asr.o GENROU_11mix.o GENROU_12jac.o GENROU_13opt.o GENROU_14lnz.o GENROU_15syn.o GENROU_16dae.o GENROU_init_fmu.o -Iinclude/ -Iinclude/fmi1 -I. -DOMC_MODEL_PREFIX=GENROU -DOMC_NUM_MIXED_SYSTEMS=0 -DOMC_NUM_LINEAR_SYSTEMS=0 -DOMC_NUM_NONLINEAR_SYSTEMS=0 -DOMC_NDELAY_EXPRESSIONS=0 -DOMC_NVAR_STRING=0 -L"c:/users/simonz~1/appdata/local/temp/tmp7j8dix/GENROU/win_fmu" -falign-functions -msse2 -mfpmath=sse -L"C:/OpenModelica1.11.0-64bit//lib//omc" -Wl,-rpath,"C:/OpenModelica1.11.0-64bit//lib//omc" -static-libgcc -static-libstdc++ -lregex -lexpat -lomcgc -lpthread -fopenmp -loleaut32 -lz -lhdf5 -lSimulationRuntimeC -lomcgc -lexpat -lregex -static-libgcc -luuid -loleaut32 -lole32 -lws2_32 -llis -lumfpack -lklu -lcolamd -lbtf -lamd -lsundials_idas -lsundials_kinsol -lsundials_nvecserial -lipopt -lcoinmumps -lpthread -lm -lgfortranbegin -lgfortran -lmingw32 -lgcc_eh -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32 -ladvapi32 -lshell32 -lopenblas -lcminpack -lwsock32 -lstdc++ -llis -Wl,--kill-at 

Es führt Problem zu Linker, wo libstdC++ twise definiert ist, einmal in libstdc++.a und die andere in libstdc++.dll.a

C:/OpenModelica1.11.0-64bit/tools/msys/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0\libstdc++.a(fstream-inst.o):(.text$_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev[_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev]+0x0): multiple definition of `std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf()' 

C:/OpenModelica1.11.0-64bit/tools/msys/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/libstdc++.dll.a(d002277.o):(.text+0x0): first defined here 

C:/OpenModelica1.11.0-64bit/tools/msys/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0\libstdc++.a(fstream-inst.o):(.text$_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv[_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv]+0x0): multiple definition of `std::basic_filebuf<char, std::char_traits<char> >::close()' 

C:/OpenModelica1.11.0-64bit/tools/msys/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/libstdc++.dll.a(d002264.o):(.text+0x0): first defined here 

C:/OpenModelica1.11.0-64bit/tools/msys/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0\libstdc++.a(fstream-inst.o):(.text$_ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev[_ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev]+0x0): multiple definition of `std::basic_filebuf<char, std::char_traits<char> >::~basic_filebuf()' 

C:/OpenModelica1.11.0-64bit/tools/msys/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/libstdc++.dll.a(d002281.o):(.text+0x0): first defined here 

C:/OpenModelica1.11.0-64bit/tools/msys/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0\libstdc++.a(fstream-inst.o):(.text$_ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode[_ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode]+0x0): multiple definition of `std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)' 

[Several lines with the same 'multiple definition' omitted] 

collect2.exe: error: ld returned 1 exit status 

Makefile:41: recipe for target 'GENROU_FMU' failed 

mingw32-make: *** [GENROU_FMU] Error 1 

ich in dem aufgegebenen Ordner und beide Dateien sind vorhanden. Ich weiß nicht, wie sie dort gelandet sind.

Durch den Einsatz von OMShell.exe konnte ich ein paar Informationen darüber bekommen, was kann

getLinker() 
"g++ -shared -Xlinker --export-all-symbols -fPIC" 

setLinkerFlags("-static-libgcc -static-libstdc++ -lregex -lexpat -lomcgc -lpthread -fopenmp -loleaut32 -lz -lhdf5") 
true 

getLinkerFlags() 
"-static-libgcc -static-libstdc++ -lregex -lexpat -lomcgc -lpthread -fopenmp -loleaut32 -lz -lhdf5" 

getCompiler() 
"gcc" 

getCFlags() 
"${SIM_OR_DYNLOAD_OPT_LEVEL} -falign-functions -msse2 -mfpmath=sse ${MODELICAUSERCFLAGS}" 

getEnvironmentVar("SIM_OR_DYNLOAD_OPT_LEVEL") 
"" 

getEnvironmentVar("MODELICAUSERCFLAGS") 
"" 

getCXXCompiler() 
"g++" 

getCompileCommand() 
"g++" 
+0

Warum ist '-lstdC++' in der Kommandozeile als auch, das nicht standardmäßig hinzugefügt? Was passiert, wenn Sie es entfernen? – ssbssa

+0

Wie gesagt, ein Teil der Befehlszeile wird vom Tool generiert, ich habe keine vollständige Kontrolle darüber. Ich werde heute versuchen, nur den Code generiert zu haben, um dieses Flag zu entfernen und manuell zu kompilieren – Bl4ckb0ne

Antwort

0

Sie buildModelFMU(..., fmuType="me", platforms={"static"}) könnten versuchen, um zu sehen, geändert werden, wenn es besser, insbesondere funktioniert, wenn Sie verwenden setLinker("gcc") und setLinkerFlags(...) ändern.

Andernfalls installieren Sie eine Linux-VM (oder das Ubuntu-Subsystem in Windows) und kompilieren Sie mit platforms={"x86_64-w64-mingw32"} (oder i686 für 32-Bit), die eine andere Mingw GCC-Version verwenden. Der letzte Link-Befehl für mich mit Linux verwendet reguläre GCC und keine -llibstd++:

x86_64-w64-mingw32-gcc -shared -o M.dll M_FMU.o ... -flto -shared -static-libgcc -lm -Wl,-Bstatic -lpthread -Wl,-Bdynamic 
+0

Ich habe die 'buildModelFMU' Funktion vorher versucht, aber es kam keine andere Ausgabe heraus. Wahrscheinlich wegen [dieser Zeile] (https://github.com/OpenModelica/OMCompiler/blob/e988ea489dc83b386647aa1d5237bfe8a61b48ae/Compiler/Script/CevalScriptBackend.mo#L3228). Die Ausgabe für in der Frage stammt von Windows 7, und ich denke, es verwendet die Mingw, die mit dem Installer verpackt ist. Ich werde Ihnen nach einigen Tests ein Feedback geben, danke – Bl4ckb0ne

+0

Wie konnten Sie den finalen Link-Befehl sehen, wenn er kompiliert wurde? Ich habe überhaupt keine Ausgabe, wenn alles gut läuft – Bl4ckb0ne

+0

Es gibt ein Config.log in der FMU. Wenn Sie die gleiche configure-Zeile ausführen und dann im Quellenverzeichnis "make" wählen, erhalten Sie das Build-Protokoll. Es ist nicht in der FMU (leider) gespeichert. –

Verwandte Themen