tagger tag picard para musicbrainz mac kid3 for easytag app linux opencv cmake static-libraries static-linking

linux - tag - picard app



¿Cómo le digo a cmake que quiero que mi proyecto vincule las bibliotecas de forma estática? (6)

Estoy tratando de construir un proyecto basado en OpenCV usando CMake, ejecutándose en Linux. Hasta ahora mis archivos CMakeLists.txt parecen a algo como

FIND_PACKAGE (OpenCV REQUIRED) ... TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})

pero esto da como resultado bibliotecas enlazadas dinámicamente. ¿Cómo puedo enlazar con bibliotecas estáticas?


AFAIK es un poco complicado, porque CMake, más precisamente el comando find_library, prefiere libs compartidas y las encuentra si están disponibles compartidas y estáticas.

Sigo buscando una buena solución para poder compilar binarios "lo más estático posible", pero aún no he encontrado una solución elegante. La única forma en que seguramente funcionaría es implementar todo a través de módulos personalizados FindXXXX.


En realidad, este problema parece que ya se ha solucionado en el OpenCVConfig.cmake que viene con OpenCV. Todo lo que tienes que hacer es definir OpenCV_STATIC en tu CMakeLists.txt . Es decir

set(OpenCV_STATIC ON) find_package(OpenCV REQUIRED)


Para vincular todo de forma estática, creo que estás buscando CMAKE_EXE_LINKER_FLAGS (agregar -static ).

¿Está utilizando el ''método simple'' de OpenCVConfig.cmake? o el antiguo FindOpenCV.cmake?


Tenga en cuenta que gcc se niega a enlazar si pasa la opción -static, pero tiene libs dinámicos en los argumentos del enlace, lo que hará si simplemente usa FindOpenCV.cmake y esto recoge las libs dinámicas (no sé cómo OpenCVConfig .Cake se comporta sin embargo) ...


Usted construye bibliotecas estáticas de OpenCV simplemente estableciendo el BUILD_SHARED_LIBS en falso en CMake. Luego, todo lo que necesita hacer para crear su propia aplicación con esas bibliotecas estáticas es agregar una dependencia de OpenCV en su CMakeLists.txt :

FIND_PACKAGE (OpenCV REQUIRED) ... TARGET_LINK_LIBRARIES (your-application ${OpenCV_LIBS})

y CMake se encargará de todo.