c++ mingw static-linking

c++ - cómo hacer enlaces estáticos de libwinpthread-1.dll en mingw?



static-linking (8)

Yo uso mingw desde aquí: 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

Y me las he arreglado exitosamente para vincular estáticamente libstdc++-6.dll y libgcc_s_sjlj-1.dll usando parámetros -static-libgcc -static-libstdc++ , pero no puedo encontrar un comando para hacer lo mismo con libwinpthread-1.dll .


Aparentemente, CMake hace algunas cosas raras sobre cómo se -Wl los -Wl compilador -Wl , lo que hace que la -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic no funcione, con solo otras dos opciones aparentemente a la izquierda: el indicador del compilador incorrecto -static y el feo indicador del compilador -Wl,--whole-archive .

Mientras tanto, la buena opción que realmente funciona en CMake, aunque parece bastante indocumentada, es usar directamente los indicadores del enlazador. Por lo tanto, en CMake, esta parece ser la mejor forma de vincular estáticamente a todas las dependencias Mingw-w64 C ++:

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

Se debe tener en cuenta que incluso si no hay una biblioteca que siga explícitamente -dynamic , se debe seguir aplicando para garantizar que las bibliotecas estándar implícitamente vinculadas se vinculen correctamente.


Para cualquiera que trabaje en CMake, esta solución se implementa fácilmente en su archivo CMakeLists.txt de la siguiente manera ...

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


Para vincular estáticamente winpthread, incluso si no se usa threading en el programa, pase los -Bstatic y --whole-archive al enlazador:

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

Tenga en cuenta lo siguiente:

  • La opción "archivo completo" debe desactivarse inmediatamente después.
  • No necesita hacer este hack si su programa realmente utiliza símbolos de la biblioteca (es decir, usa <thread> de C ++ 11), en cuyo caso la biblioteca no se eliminará cuando lo enlace estáticamente.
  • Este truco está diseñado para MinGW-w64, para arreglar las dependencias de libwinpthread-1.dll .

Probablemente deberías verificar la documentación de las opciones de línea de comando para GCC.

No se trata de un comando ''-static-something'', solo las bibliotecas estándar (libgcc y libstdc ++) se pueden establecer en enlaces estáticos con un comando. Para otras bibliotecas, primero cambia a la vinculación estática con "-static" y luego enumera las bibliotecas para incluirlas con comandos separados, es decir, "-lpthread".


Prueba esto:

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

Observe el -lstdc++ antes de -lpthread . Funcionó para mí

Asegúrese de agregar esto al final de su línea de comando g++ .


Si su cadena de herramientas incluye winpthreads estáticos, agregue la opción

-static

Recopilará versiones estáticas de todas las bibliotecas que pueda.

Alternativamente, puede eliminar libwinpthread.dll.a y la DLL misma de los directorios de toolchain. Sin embargo, esto podría arruinar los programas que enlazan con las DLL libstdc ++ y libgcc, así que ten cuidado.

Una tercera opción es usar -Wl,-Bdynamic y -Wl,-Bstatic para seleccionar en qué versión desea enlazarse (que es lo que -static hace internamente cuando se llama ld). Un ejemplo:

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

Si ejecuta su comando de enlace con -v agregado, debería ver estas opciones que aparecen en la invocación ld / collect2 cuando usa -static-libgcc y -static-libgcc -static-libstdc++ .


Solo agregue -static a su CFLAGS .

Por ejemplo: ./configure CFLAGS="-static" .

Esto vinculará todas las bibliotecas estáticas con su archivo ejecutable.


Yo tuve el mismo problema. Estoy usando Code :: Blocks, y tuve éxito al agregar una línea adicional en los comandos del enlazador:

-lpthread -L libwinpthread-1.dll

Este comando debe agregarse siempre que implemente otros comandos del enlazador, como:

-static-libgcc -static-libstdc++

No recibo errores de compilación o advertencias al implementar este comando. La primera directiva, -lpthread , especifica el archivo de encabezado y la directiva final, -L , se usa para vincular un archivo específico.

Estoy usando gcc versión 4.8.1. Esta versión posterior contiene correcciones de errores para * to_string *, por ejemplo, que necesitaba.