Подтвердить что ты не робот

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

4b9b3361

Ответ 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".

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