tutorial running how gui descarga gcc linker cmake static-libraries static-linking

gcc - running - CMake y vinculación estática



how to use cmake ubuntu (2)

He logrado resolver mi problema usando lo siguiente:

#Dynamic/Shared Libs ... #Static start set_target_properties(icarus PROPERTIES LINK_SEARCH_START_STATIC 1) set_target_properties(icarus PROPERTIES LINK_SEARCH_END_STATIC 1) set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") #Static Libs ... #Set Linker flags set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")

Esto funciona sin pasar una -static que crea otros grandes problemas, y esencialmente puede mezclar bibliotecas estáticas y dinámicas.

Siempre que el orden de las bibliotecas estáticas sea correcto, y mientras se satisfagan las dependencias de las bibliotecas estáticas, obtengo un ELF que carga lo que son dinámicos (es decir, en mi caso mysqlclient, libmysql ++) y estático todo lo demás (crypto ++, PocoNet , PocoUtil, PocoXML, PocoFundacion).

Tenga en cuenta que las bibliotecas enlazadas estáticas tienen sus propias dependencias. Examine mi solicitud de depuración mediante aplicación -d readelf, veo:

Dynamic section at offset 0x508f88 contains 28 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libmysqlpp.so.3] 0x0000000000000001 (NEEDED) Shared library: [libmysqlclient.so.18] 0x0000000000000001 (NEEDED) Shared library: [libm.so.6] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x0000000000000001 (NEEDED) Shared library: [ld-linux-x86-64.so.2] 0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]

Sé que pthread es importado por Poco :: Runnable, libm es para operaciones matemáticas, etc. Todavía no sé si esta es la forma correcta de usar CMake para un enlace parcial estático.

En el caso de las bibliotecas empaquetadas de Debian, como crypto ++, mysql ++, mysqlclient, simplemente encontré la biblioteca * .a funcionó, pero en el caso de las bibliotecas Poco, que solo me dieron la ruta completa y el nombre de la biblioteca, pero no una bandera. -Bdynamic solo se puede desactivar usando las líneas anteriores.

Nota: Poco no se pudo vincular estáticamente, sin -static-libstdc++

Espero que esto ayude a alguien atrapado en algo similar.

Estoy usando CMake en un proyecto, y estoy tratando de vincular estáticamente algunas bibliotecas. He puesto:

set(BUILD_SHARED_LIBS OFF) set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static") set_target_properties(icarus PROPERTIES LINK_SEARCH_END_STATIC 1)

Y, al buscar las bibliotecas reales, me aseguré de tener la versión * .a de ellas.

Actualmente el proyecto importa:

libPocoNet.a libPocoUtil.a libPocoXML.a libPocoFoundation.a libmysqlclient.a libmysqlpp.a libcrypto++.a CUDA

Se encuentran todas las bibliotecas y, al realizar un enlace dinámico / compartido, funcionan bien. También he intentado establecer banderas de compilación:

set(GCC_CXX_FLAGS ${GCC_CXX_FLAGS} "-static-libgcc -static-libstdc++ -static")

Pero fue en vano. Si bien no tengo problemas al compilar, la vinculación está generando una gran cantidad de errores de referencia no definidos para las llamadas encontradas en las bibliotecas anteriores, es decir:

undefined reference to `mysql_thread_init'' undefined reference to `mysql_real_query'' undefined reference to `pthread_mutex_unlock'' undefined reference to `Poco::ErrorHandler::handle()''

No en ese orden particular, y numerosos errores para cada biblioteca.

Mirando la última línea de GCC veo:

/usr/bin/c++ -g -g -static-libgcc -static-libstdc++ -static [list of *.cpp files] -o icarus -rdynamic /usr/local/lib/libPocoFoundation.a /usr/local/lib/libPocoNet.a /usr/local/lib/libPocoUtil.a /usr/local/lib/libPocoXML.a -Wl,-Bstatic -lmysqlclient -lmysqlpp -lcrypto++

Lo que me hace preguntarme:

  1. ¿Por qué las bibliotecas de Poco están vinculadas como dinámicas, y no hay un indicador estático -Wl -Batatic? Como si se omiten / excluido de vinculación estática.
  2. mysqlclient, mysqlpp y crypto ++ parecen estar configurados para un enlace estático, pero todavía tengo errores

Entonces, ¿podría alguien explicarme por favor?

  1. ¿Cómo me configuro para un enlace estático parcial usando CMake?
  2. ¿Es CMAKE_EXE_LINKER_FLAGS el único que necesito configurar?
  3. ¿Debo forzar la vinculación estática para las bibliotecas mencionadas pero no para todo el proyecto?

Por favor, discúlpeme si esas son demasiadas preguntas o demasiado localizadas, no he probado esto antes y parece que no puedo encontrar mucha información en la red.


¿Cómo me configuro para el enlace estático utilizando CMake

Bueno ... no es así :) No es así como funciona CMake: en CMake, primero encuentras la ruta de acceso absoluta de una biblioteca y luego la vinculas con target_link_libraries.

Por lo tanto, si desea vincularse a una biblioteca estática, debe buscar esa biblioteca estática:

find_library(SOMELIB libsomelib.a)

en lugar de:

find_library(SOMELIB somelib)