Mingw статическая ссылка libstdC++

Для работы мне нужно создать общую библиотеку из файла modelica (.mo) и загрузить его в matlab. Но по некоторым причинам matlab использует другую версию libstdC++-6, которая вызывает конфликт с той, которая нужна моей общей библиотеке.

Вот командная строка, которую я использую для генерации моих.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, и для краткости я опущу остальные, которые точно такие же.

А вот и проблемная командная строка

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

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 Я смог получить немного информации о том, что можно изменить

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++"

1 ответ

Вы могли бы попробовать buildModelFMU(..., fmuType="me", platforms={"static"}) чтобы увидеть, работает ли он лучше, в частности, если вы измените использование setLinker("gcc") а также setLinkerFlags(...),

В противном случае установите виртуальную машину Linux (или подсистему Ubuntu в Windows) и выполните кросс-компиляцию, используя platforms={"x86_64-w64-mingw32"} (или i686 для 32-битной), которая будет использовать другую версию MINGW GCC. Последняя команда link для меня, использующая 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
Другие вопросы по тегам