2010-09-20 17 views
17

Estoy intentando construir un proyecto basado en OpenCV usando CMake, ejecutándose en Linux. Hasta ahora mis CMakeLists.txt archivos se ve algo como¿Cómo le digo a cmake que quiero que mi proyecto vincule las bibliotecas estáticamente?

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

pero esto da lugar a bibliotecas de enlace dinámico. ¿Cómo puedo enlazar con bibliotecas estáticas?

+0

¿Cómo señala "CMake en una construcción estática OpenCV"? Mi compilación tiene libs estáticos y compartidos. –

+0

ver la respuesta a continuación: http://stackoverflow.com/a/10709424/6069 – agnul

Respuesta

9

Crea librerías estáticas de OpenCV con solo establecer el indicador BUILD_SHARED_LIBS en false en CMake. Entonces todo lo que necesita hacer para construir su propia aplicación con las bibliotecas estáticas es añadir una dependencia de OpenCV en su CMakeLists.txt:

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

y CMake se hará cargo de todo.

+0

Es 'BUILD_SHARED_LIBS', no' _LIBRARIES'. :-) – Ela782

+0

Corregí BUILD_SHARED_LIBRARIES a BUILD_SHARED_LIBS. –

+0

Al menos con CLion en Windows (CLion 2016.3 EAP) que viene incluido con CMake 3.6.1, al compilar OpenCV 3.1.0, esta fue la única forma de las enumeradas aquí que hizo que CMake creara OpenCV como bibliotecas estáticas en lugar de bibliotecas compartidas. Tenga en cuenta que los intentos de habilitar esta opción editando CMakeLists.txt fallaron; solo editando el caché CMake a través de la ventana Caché CLion y haciendo clic en el ícono * Aplicar cambios y recargar proyecto * pude obtener mi combinación CLion/CMake para aceptar 'BUILD_SHARED_LIBS'. No estoy seguro de si esto es un problema con CLion que debe documentarse. –

8

Para vincular todo estáticamente, creo que está buscando CMAKE_EXE_LINKER_FLAGS (agregue -static).

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

1

en la línea add_library especifique static. Ver http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library

corrección ya que busca enlazar con una biblioteca estática Me gustaría ver en la propiedad CMAKE_FIND_LIBRARY_SUFFIXES

+0

Creo que el comando add_library es generar un binario de salida. En este caso, al especificar STATIC hace que genere .a. – jkerian

+0

La palabra clave estática para add_library especifica qué tipo de biblioteca genera, no es para cuando se genera el binario. – RobertJMaynard

+0

Quizás entendí mal, pero pensé que el OP intentaba vincularse con una biblioteca estática, no generar una. – jkerian

2

yo sepa que es un poco complicado, porque CMake, más precisamente el comando find_library, prefiere compartida libs y encuentra los si ambos compartidos y estáticos están disponibles.

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

+1

La única manera que tengo ahora de cambiar sufijos de biblioteca buscados: 'set (CMAKE_FIND_LIBRARY_SUFFIXES $ {CMAKE_STATIC_LIBRARY_SUFFIX})' antes de 'find_library()'. FindBoost y tiene una opción especial para forzar el uso de bibliotecas estáticas ('Boost_USE_STATIC_LIBS'), pero también funciona internamente al cambiar' CMAKE_FIND_LIBRARY_SUFFIXES'. – marcin

1

Tenga en cuenta que gcc se niega a vincular si se pasa la opción -static, pero hay bibliotecas dinámicas en los argumentos de enlace - que va si sólo basta con utilizar FindOpenCV.cmake y esto recoge las bibliotecas dinámicas (I no sé cómo se comporta OpenCVConfig.cmake) ...

4

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

set(OpenCV_STATIC ON) 
find_package(OpenCV REQUIRED) 
+0

¿Qué hace 'find_package (OpenCV REQUERED)'? – James

Cuestiones relacionadas