Mingw静态链接libstdc ++

时间:2017-08-23 16:14:25

标签: linker mingw openmodelica

出于工作目的,我需要从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

1 个答案:

答案 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