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++"
Warum ist '-lstdC++' in der Kommandozeile als auch, das nicht standardmäßig hinzugefügt? Was passiert, wenn Sie es entfernen? – ssbssa
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