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

44

Решение

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

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

19

Другие решения

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

-static

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

Кроме того, вы можете удалить libwinpthread.dll.a и саму DLL из каталогов цепочки инструментов. Это может испортить программы, связанные с библиотеками libstdc ++ и 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++,

38

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

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

Обратите внимание на -lstdc++ до -lpthread, Это сработало для меня.

Не забудьте добавить это в самый конец вашего g++ командная строка.

23

Для статической ссылки winpthread даже если в программе не используется многопоточность, передайте -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 зависимостей.
10

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

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

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

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

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

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

1

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

-lpthread -L libwinpthread-1.dll

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

-static-libgcc
-static-libstdc++

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

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

-2

Просто добавь -static на ваш CFLAGS,

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

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

-2
По вопросам рекламы [email protected]