出于工作目的,我需要从modelica文件(.mo)生成一个共享库并加载到matlab中。但由于某些原因,matlab使用不同版本的libstdc ++ - 6导致与我的共享库所需的版本冲突。
这是我用来生成.o文件的命令行。 .mo文件先前已转换为c文件。
fnl = fnl.insert(loc=1, column='N', value=15)
正在创建一堆.o文件,为了简洁起见,我将省略其他文件,这些文件完全相同。
这是有问题的命令行
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
导致链接器问题,其中libstdc ++定义为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++.a
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
答案 0 :(得分:0)
您可以尝试buildModelFMU(..., fmuType="me", platforms={"static"})
查看它是否有效,特别是如果您更改使用setLinker("gcc")
和setLinkerFlags(...)
。
否则,安装Linux VM(或Windows中的Ubuntu子系统)并使用platforms={"x86_64-w64-mingw32"}
(或32位i686)进行交叉编译,这将使用不同的mingw GCC版本。
使用Linux的最终链接命令使用常规GCC而不是-llibstd++
:
x86_64-w64-mingw32-gcc -shared -o M.dll M_FMU.o ... -flto -shared -static-libgcc -lm -Wl,-Bstatic -lpthread -Wl,-Bdynamic