как сделать статическое связывание 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.

8 ответов


вы, вероятно, должны проверить документацию параметров командной строки для GCC.

Это не команда "- static-something", только стандартные библиотеки (libgcc и libstdc++) могут быть установлены в статическую связь с одной командой. Для других библиотек вы сначала переключаетесь на статическую связь с "- static", а затем перечисляете библиотеки для включения с отдельными командами, т. е."- lpthread".


если ваша цепочка инструментов включает статические winpthreads, добавив опцию

-static

будет тянуть статические версии всех библиотек, которые он может.

кроме того, вы можете удалить libwinpthread.файл DLL.a и сама DLL из каталогов toolchain. Это может испортить программы, связанные с библиотеками libstdc++ и libgcc, поэтому будьте осторожны.

третий вариант-использовать -Wl,-Bdynamic и -Wl,-Bstatic чтобы выбрать, какую версию вы хотите связать (что именно -static внутренне делает, когда вызывается ld). Пример:

gcc -o someexec someobject.o -Wl,-Bdynamic -lsomelibIwantshared -Wl,-Bstatic -lsomelibIwantstatic

если вы запустите команду link с -v добавлено, вы должны увидеть эти параметры, появляющиеся в вызове LD / collect2 при использовании -static-libgcc и -static-libstdc++.


попробуйте это:

-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic

уведомления -lstdc++ до -lpthread. У меня получилось.

обязательно добавьте это в конец вашего g++ командная строка.


статически ссылке winpthread даже если threading не используется в программе, передайте -Bstatic и --whole-archive параметры компоновщика:

g++ -o hello.exe hello.cpp -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive

обратите внимание на следующее:

  • опция "весь архив" должна быть отключена сразу после этого.
  • вам не нужно делать этот хак, Если ваша программа использует символы из библиотеки (т. е. вы используете <thread> из C++11), в этом случае библиотека не упала, когда вы статически связать его.
  • этот хак предназначен для MinGW-w64, чтобы исправить libwinpthread-1.dll файлы зависимостей.

для всех, кто работает в CMake, это решение легко реализуется в ваших CMakeLists.txt файл следующим образом...

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")

по-видимому, CMake делает некоторые странные вещи с тем, как -Wl флаги компилятора обрабатываются, что делает -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic решение не работает, осталось только два других варианта: плохой флаг компилятора -static и уродливый флаг компилятора -Wl,--whole-archive.

между тем, хороший вариант, который действительно работает в CMake, но кажется довольно недокументированным, - это напрямую использовать флаги компоновщика. Следовательно, в CMake это, по-видимому, лучший способ статически связать все mingw-w64 c++ зависимости:

target_link_libraries (MyVeryAwesomeApp -static gcc stdc++ winpthread -dynamic)

следует отметить, что даже если нет библиотеки, явно следующей -dynamic, он все равно должен применяться, чтобы гарантировать, что стандартные, неявно связанные библиотеки связаны правильно.


у меня была та же проблема. Я использую Code::Blocks, и у меня был успех, добавив дополнительную строку в linker commmands:

-lpthread -L libwinpthread-1.dll

эта команда должна быть добавлена везде, где вы реализуете другие команды компоновщика, такие как:

-static-libgcc
-static-libstdc++

Я не получаю ошибок компиляции или предупреждений при реализации этой команды. Первая директива, -lpthread, задает файл заголовка и конечную директиву, - L, используется для связи определенного файл.

Я использую GCC версии 4.8.1. Эта более поздняя версия содержит исправления ошибок для *to_string*, например, которые мне нужны.


просто добавить -static на CFLAGS.

например: ./configure CFLAGS="-static".

это свяжет все статические библиотеки с вашим исполняемым файлом.