作業目的私はmodelicaファイル(.mo)から共有ライブラリを生成し、matlabにロードする必要があります。しかし、いくつかの理由で、matlabは私の共有ライブラリが必要とするものと衝突するlibstdC++ - 6の別のバージョンを使用します。Mingw静的リンクlibstdC++
私の.oファイルの生成に使用しているコマンドラインは次のとおりです。以前は.moファイルがcファイルに変換されていました。
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
.oファイルの束がgeneretedされている、と簡潔さの理由のために私はまったく同じです他の人を、OMMITます。
そしてここでは、問題のあるコマンドラインそれはのlibstdC++がlibstdc++.a
に一度、twiseを定義している場合、問題をリンカにつながる
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
、と私がチェックイン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
で他のですフォルダと両方のファイルが存在します。私は彼らがそこで終わった方法を知らない。 OMShell.exe
の使用により
私はあなたがsetLinker("gcc")
とsetLinkerFlags(...)
を使用して変更した場合は特に、それは良い作品かどうかを確認するためにbuildModelFMU(..., fmuType="me", platforms={"static"})
を試みることができる
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++"
はなぜ++ '' -lstdcコマンドラインでも、それがデフォルトで追加されていないです: は私がLinuxを使用するための最後のリンクコマンドは、通常のGCCなし
-llibstd++
を使用していますか?それを削除するとどうなりますか? – ssbssa私が言ったように、コマンドラインの一部はツールによって生成され、私はそれを完全に制御することはできません。私は今日、このフラグを削除して手でコンパイルするコードを作成しようとします。 – Bl4ckb0ne