首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mingw静态链接libstdc++

Mingw静态链接libstdc++
EN

Stack Overflow用户
提问于 2017-08-24 00:14:25
回答 1查看 1.3K关注 0票数 1

出于工作目的,我需要从modelica文件(.mo)生成一个共享库,并加载到matlab中。但是由于某些原因,matlab使用了不同版本的libstdc++-6,导致与我的共享库所需的版本冲突。

下面是我用来生成.o文件的命令行。.mo文件先前已转换为c文件。

代码语言:javascript
复制
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文件,为简洁起见,我将省略其他文件,它们是完全相同的。

下面是有问题的命令行

代码语言:javascript
复制
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++是按顺序定义的,一次在libstdc++.a中,另一次在libstdc++.dll.a

代码语言:javascript
复制
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,我能够获得一些关于可以修改的信息

代码语言:javascript
复制
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++"
EN

回答 1

Stack Overflow用户

发布于 2017-08-25 13:58:02

您可以尝试使用buildModelFMU(..., fmuType="me", platforms={"static"}),看看它是否工作得更好,特别是当您更改了use setLinker("gcc")setLinkerFlags(...)时。

否则,安装一个Linux虚拟机(或者Windows中的Ubuntu子系统),并使用platforms={"x86_64-w64-mingw32"} (或者32位的i686 )进行交叉编译,它将使用不同的名为GCC的版本。对于我来说,使用Linux的最后一个链接命令使用的是普通的GCC,没有-llibstd++

代码语言:javascript
复制
x86_64-w64-mingw32-gcc -shared -o M.dll M_FMU.o ... -flto -shared -static-libgcc -lm  -Wl,-Bstatic -lpthread -Wl,-Bdynamic
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45844755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档