Как сделать статическое связывание libwinpthread-1.dll в mingw?
Я использую mingw отсюда: http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.7.2/32-bit/threads-posix/sjlj/x32-4.7.2-release-posix-sjlj-rev2.7z/download
И мне удалось связать статически libstdc++-6.dll
и libgcc_s_sjlj-1.dll
с помощью параметров -static-libgcc -static-libstdc++
, но я не могу найти команду для того, чтобы сделать то же самое с libwinpthread-1.dll
.
Ответы
Ответ 1
Вероятно, вы должны проверить документацию параметров командной строки для GCC.
Эти команды no '-static-something', только стандартные библиотеки (libgcc и libstdС++) могут быть установлены на статические ссылки с одной командой. Для других библиотек вы сначала переключаетесь на статическую связь с "-static", а затем перечисляете библиотеки для включения с отдельными командами, то есть "-lpthread".
Ответ 2
Если ваша toolchain включает статические winpthreads, добавив опцию
-static
Вытащить статические версии всех библиотек, которые он может использовать.
Кроме того, вы можете удалить libwinpthread.dll.a и самую DLL из каталогов инструментальных цепей. Это может испортить программы, связанные с библиотеками libstdС++ и libgcc, но будьте осторожны.
Третий вариант - использовать -Wl,-Bdynamic
и -Wl,-Bstatic
, чтобы выбрать, к какой версии вы хотите привязать (что является тем, что -static
делает внутри, когда ld вызывается). Пример:
gcc -o someexec someobject.o -Wl,-Bdynamic -lsomelibIwantshared -Wl,-Bstatic -lsomelibIwantstatic
Если вы запустите свою ссылку с помощью -v
, вы увидите эти параметры, появляющиеся в вызове ld/collect2, когда вы используете -static-libgcc
и -static-libstdc++
.
Ответ 3
Попробуйте следующее:
-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic
Обратите внимание на -lstdc++
до -lpthread
. Это сработало для меня.
Обязательно добавьте это в самый конец командной строки g++
.
Ответ 4
Чтобы статически связать winpthread, даже если потоковая передача не используется в программе, передайте параметры -Bstatic
и --whole-archive
в компоновщик:
g++ -o hello.exe hello.cpp -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive
Обратите внимание на следующее:
- Опция "весь архив" должна быть немедленно отключена.
- Вам не нужно делать этот взлом, если ваша программа фактически использует символы из библиотеки (т.е. вы используете
<thread>
из С++ 11), и в этом случае библиотека не будет удалена при статической ссылке на нее.
- Этот хак предназначен для MinGW-w64 для исправления зависимостей libwinpthread-1.dll.
Ответ 5
Для тех, кто работает в CMake, это решение легко реализуется в вашем файле CMakeLists.txt следующим образом:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
Ответ 6
У меня была та же проблема. Я использую Code:: Blocks, и у меня был успех, добавив дополнительную строку в коммандере компоновщика:
-lpthread -L libwinpthread-1.dll
Эта команда должна быть добавлена везде, где вы реализуете другие команды компоновщика, такие как:
-static-libgcc
-static-libstdc++
При реализации этой команды я не получаю ошибок компиляции или предупреждений. Первая директива, -lpthread, указывает заголовочный файл и директив trailing -L, используется для связывания определенного файла.
Я использую gcc версии 4.8.1. Эта более поздняя версия содержит исправления ошибок для * to_string *, например, которые мне нужны.
Ответ 7
Просто добавьте -static
к вашему CFLAGS
.
Например: ./configure CFLAGS="-static"
.
Это свяжет все статические библиотеки с вашим исполняемым файлом.