¿Cómo hacer que CMake vincule un ejecutable a una biblioteca compartida externa que no está construida dentro del mismo proyecto CMake?
Solo hacer target_link_libraries(GLBall ${CMAKE_BINARY_DIR}/res/mylib.so)
da el error
make[2]: *** No rule to make target `res/mylib.so', needed by `GLBall'. Stop.
make[1]: *** [CMakeFiles/GLBall.dir/all] Error 2
make: *** [all] Error 2
(GLBall is the executable)
después de copiar la biblioteca en el directorio binario bin/res
.
Traté de usar find_library(RESULT mylib.so PATHS ${CMAKE_BINARY_DIR}/res)
Lo cual falla con RESULT-NOTFOUND
.
link_directories
desaconseja su uso, incluso en su propia documentación. Creo que sería mejor aquí resolver lafind_library
llamada fallida en la pregunta original, o usar la solución de @ Andre.find_library
y usar esta ruta en lugar de codificarla, cf. mi respuesta .La respuesta de arrowdodger es correcta y preferida en muchas ocasiones. Simplemente me gustaría agregar una alternativa a su respuesta:
Puede agregar un objetivo de biblioteca "importado", en lugar de un directorio de enlaces. Algo como:
Y luego enlace como si su biblioteca fuera construida por su proyecto:
Tal enfoque le daría un poco más de flexibilidad: eche un vistazo al comando add_library () y las muchas propiedades de destino relacionadas con las bibliotecas importadas .
No sé si esto resolverá su problema con las "versiones actualizadas de libs".
fuente
add_library( mylib SHARED IMPORTED )
eso o obtendrá unadd_library called with IMPORTED argument but no library type
errorIMPORTED_LOCATION
del corchete de apertura está malGLOBAL
despuésIMPORTED
si desea acceder a la biblioteca importada en directorios superiores al actual:add_library(breakpad STATIC IMPORTED GLOBAL)
Supongo que desea vincular a una biblioteca llamada foo , su nombre de archivo generalmente es algo vinculado
foo.dll
olibfoo.so
.1. Encuentra la biblioteca
Tienes que encontrar la biblioteca. Esta es una buena idea, incluso si conoce el camino a su biblioteca. CMake generará un error si la biblioteca se desvaneció u obtuvo un nuevo nombre. Esto ayuda a detectar el error temprano y dejar en claro al usuario (puede ser usted mismo) qué causa un problema.
Para encontrar una biblioteca foo y almacenar la ruta en
FOO_LIB
usoCMake descubrirá por sí mismo cómo es el nombre real del archivo. Comprueba los lugares habituales como
/usr/lib
,/usr/lib64
y los caminos enPATH
.Ya sabes la ubicación de tu biblioteca. Agréguelo a
CMAKE_PREFIX_PATH
cuando llame a CMake, luego CMake buscará su biblioteca en las rutas pasadas también.A veces necesita agregar sugerencias o sufijos de ruta, consulte la documentación para obtener más detalles: https://cmake.org/cmake/help/latest/command/find_library.html
2. Enlace la biblioteca de 1. tiene el nombre completo de la biblioteca
FOO_LIB
. Usas esto para vincular la biblioteca a tu objetivoGLBall
como enDebe agregar
PRIVATE
,PUBLIC
oINTERFACE
después del objetivo, cf. la documentación: https://cmake.org/cmake/help/latest/command/target_link_libraries.htmlSi no agrega uno de estos especificadores de visibilidad, se comportará como
PRIVATE
oPUBLIC
, según la versión de CMake y el conjunto de políticas.3. Agregar incluye (este paso puede no ser obligatorio).
Si también desea incluir archivos de encabezado, use
find_path
similarfind_library
y busque un archivo de encabezado. Luego agregue el directorio de inclusión contarget_include_directories
similar atarget_link_libraries
.Documentación: https://cmake.org/cmake/help/latest/command/find_path.html y https://cmake.org/cmake/help/latest/command/target_include_directories.html
Si está disponible para el software externo, puede reemplazar
find_library
yfind_path
porfind_package
.fuente
find_package
es mucho más simple que seguir estos pasostarget_link_libraries(mylib "${FOO_LIB}")
? El objetivomylib
en lugar de su objetivo real,GLBall
? no tiene mucho sentido para míUna alternativa más, en el caso de que esté trabajando con la tienda de aplicaciones, necesita "Derechos" y, como tal, necesita vincularse con un Apple-Framework.
Para que los derechos funcionen (por ejemplo, GameCenter), debe tener un "Enlace binario con bibliotecas" -buildstep y luego enlazar con "GameKit.framework". CMake "inyecta" las bibliotecas en un "nivel bajo" en la línea de comandos, por lo tanto, Xcode realmente no lo sabe y, como tal, no habilitará GameKit en la pantalla Capacidades.
Una forma de usar CMake y tener un "Enlace con binarios" -buildstep es generar el xcodeproj con CMake, y luego usar 'sed' para 'buscar y reemplazar' y agregar el GameKit de la forma en que a XCode le gusta ...
El script se ve así (para Xcode 6.3.1).
guarda esto en "gamecenter.sed" y luego "aplícalo" así (¡cambia tu xcodeproj!)
Es posible que tenga que cambiar los comandos de script para satisfacer sus necesidades.
Advertencia: es probable que se rompa con diferentes versiones de Xcode, ya que el formato del proyecto podría cambiar, el número único (codificado) podría no ser realmente único, y en general las soluciones de otras personas son mejores, por lo que a menos que necesite apoyar la tienda de aplicaciones + Derechos (y compilaciones automatizadas), no hagas esto.
Este es un error de CMake, consulte http://cmake.org/Bug/view.php?id=14185 y http://gitlab.kitware.com/cmake/cmake/issues/14185
fuente