Я использую 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
,
Вы, вероятно, должны проверить документацию параметров командной строки для GCC.
Это не команда «-static-что-то», только стандартные библиотеки (libgcc и libstdc ++) могут быть установлены на статическое связывание с одной командой. Для других библиотек вы сначала переключаетесь на статическое связывание с помощью «-static», а затем перечисляете библиотеки для включения с помощью отдельных команд, то есть «-lpthread».
Если ваш набор инструментов содержит статические потоки 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++
,
Попробуй это:
-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic
Обратите внимание на -lstdc++
до -lpthread
, Это сработало для меня.
Не забудьте добавить это в самый конец вашего g++
командная строка.
Для статической ссылки winpthread даже если в программе не используется многопоточность, передайте -Bstatic
а также --whole-archive
Параметры для компоновщика:
g++ -o hello.exe hello.cpp -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive
Обратите внимание на следующее:
<thread>
из C ++ 11), и в этом случае библиотека не будет удалена при статическом связывании.Для всех, кто работает в 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 это, кажется, лучший способ статически связать все зависимости C ++ mingw-w64:
target_link_libraries (MyVeryAwesomeApp -static gcc stdc++ winpthread -dynamic)
Следует отметить, что даже если нет явной библиотеки -dynamic
, он все еще должен применяться, чтобы гарантировать, что стандартные, неявно связанные библиотеки связаны правильно.
У меня такая же проблема. Я использую Code :: Blocks, и я добился успеха, добавив дополнительную строку в команды компоновщика:
-lpthread -L libwinpthread-1.dll
Эта команда должна быть добавлена везде, где вы реализуете другие команды компоновщика, такие как:
-static-libgcc
-static-libstdc++
Я не получаю ошибок компиляции или предупреждений при реализации этой команды. Первая директива, -lpthread, определяет заголовочный файл и конечную директиву, -L, используется для ссылки на определенный файл.
Я использую GCC версии 4.8.1. Эта более поздняя версия содержит исправления ошибок для * to_string *, например, которые мне были нужны.
Просто добавь -static
на ваш CFLAGS
,
Например: ./configure CFLAGS="-static"
,
Это свяжет все статические библиотеки с вашим исполняемым файлом.