Динамическое связывание с libstdc ++ не работает при компиляции с x86_64-w64-mingw32-cmake - PullRequest
0 голосов
/ 04 мая 2020

Я кросс-компилирую Windows 64-битное приложение с моей Linux 64-битной машины.

Сборка Linux работает безупречно, но на windows приложение вылетает с «точкой входа в процедуру ...... basic_ostringstream ...... char_traits .... не может быть находится в динамической c библиотеке ссылок ....

Я компилирую и использую много DLL-файлов, которые загружаю во время выполнения, и я НЕ хочу статически ссылаться на libstdc ++ на каждом из них, потому что он добавляет 15 мегабайт на каждом, что не имеет смысла в моей модульной системе с потенциально сотнями модулей, которые в противном случае были бы всего 500 КБ.

Я принимаю либо размещение dll в каталоге исполняемых файлов, либо статическую ссылку на нее в только ОДНА библиотека, которая динамически связана с этими модулями. Кажется, ни одна из них не работает.

Я попытался поместить файл libstdc ++ - 6.dll в каталог, проблема не устранена. Я попытался статически связать его в общей библиотеке, которая это динамически связано, та же проблема все еще.

Вот моя конфигурация cmake для динамически связанной версии:

target_link_libraries(myModule gcc stdc++)

Это хорошо работает, когда я использую -static-libstdc++ вместо stdc++, но это решение плохо из-за увеличенного размера в результирующей библиотеке.

У кого-нибудь есть решение? Я что-то не так делаю?


~ >>> x86_64-w64-mingw32-g++ -v                                                                                                    
Using built-in specs.
COLLECT_GCC=x86_64-w64-mingw32-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-w64-mingw32/9.3.0/lto-wrapper
Target: x86_64-w64-mingw32
Configured with: /home/olivier/.cache/yay/mingw-w64-gcc/src/gcc/configure --prefix=/usr --libexecdir=/usr/lib --target=x86_64-w64-mingw32 --with-pkgversion='Arch Linux 9.3.0-1' --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,lto,c++,objc,obj-c++,fortran,ada --enable-shared --enable-static --enable-threads=posix --enable-fully-dynamic-string --enable-libstdcxx-time=yes --enable-libstdcxx-filesystem-ts=yes --with-system-zlib --enable-cloog-backend=isl --enable-lto --disable-dw2-exceptions --enable-libgomp --disable-multilib --enable-checking=release
Thread model: posix
gcc version 9.3.0 (Arch Linux 9.3.0-1) 

РЕДАКТИРОВАТЬ: Решено. Оказывается, я не использовал правильный файл libstdc ++ - 6.dll ... После обнаружения его в моей системе было несколько файлов

>>> locate libstdc++-6.dll
/home/****/****/****/libstdc++-6.dll
/usr/i686-w64-mingw32/bin/libstdc++-6.dll
/usr/x86_64-w64-mingw32/bin/libstdc++-6.dll

Я сделал различие между всеми тремя результатами (первый из которых был один, который я копировал на мой windows аппарат, который не работал)

Каким-то образом тот, который я использовал, был таким же, как i686-w64, и отличался от x86_64-w64 ...

Я попробовал с другим, и это сработало!

1 Ответ

0 голосов
/ 07 мая 2020

решаемая. Для всех, у кого есть эта проблема, убедитесь, что вы используете dll, которая поставляется с той же версией mingw, что и та, с которой вы компилируете.

...