2017-08-23 9 views
0

作業目的私は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++" 
+0

はなぜ++ '' -lstdcコマンドラインでも、それがデフォルトで追加されていないです: は私がLinuxを使用するための最後のリンクコマンドは、通常のGCCなし-llibstd++を使用していますか?それを削除するとどうなりますか? – ssbssa

+0

私が言ったように、コマンドラインの一部はツールによって生成され、私はそれを完全に制御することはできません。私は今日、このフラグを削除して手でコンパイルするコードを作成しようとします。 – Bl4ckb0ne

答えて

0

を変更することができるかについて、いくつかの情報を得ることができました。

それ以外の場合は、Linux VM(WindowsではUbuntuサブシステム)をインストールし、異なるmingw GCCバージョンを使用するplatforms={"x86_64-w64-mingw32"}(またはi686 for 32-bit)を使用してクロスコンパイルします。

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

前に 'buildModelFMU'関数を試しましたが、別の出力は出ませんでした。おそらく[この行](https://github.com/OpenModelica/OMCompiler/blob/e988ea489dc83b386647aa1d5237bfe8a61b48ae/Compiler/Script/CevalScriptBackend.mo#L3228)のためです。問題の出力はWindows 7からのもので、私はそれがインストーラにパッケージされているmingwを使用していると思います。私はあなたにいくつかのテストの後、フィードバックを与えるでしょう – Bl4ckb0ne

+0

また、どのように最終的なリンクコマンドを見ることができた場合、それはうまくコンパイルされた?すべてが正常に実行されても何の出力もありません。 – Bl4ckb0ne

+0

FMUにconfig.logがあります。同じconfigure行を実行してから、sourcesディレクトリに "make"を実行すると、ビルドログが表示されます。それはFMUに格納されていません(悲しいことに)。 –

関連する問題