как сделать статическое связывание 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"
.
это свяжет все статические библиотеки с вашим исполняемым файлом.