CMomar enlace a la biblioteca externa

¿Cómo hacer para que CMake vincule un ejecutable a una biblioteca compartida externa que no está construida dentro del mismo proyecto CMake?

Solo haciendo 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 .

Intenté usar find_library(RESULT mylib.so PATHS ${CMAKE_BINARY_DIR}/res)

Lo cual falla con RESULT-NOTFOUND .

    Establezca la ruta de búsqueda de bibliotecas primero:

     LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/res) 

    Y luego solo hazlo

     TARGET_LINK_LIBRARIES(GLBall mylib) 

    La respuesta de arrowdodger es correcta y preferida en muchas ocasiones. Simplemente me gustaría agregar una alternativa a su respuesta:

    Puede agregar un objective de biblioteca “importado”, en lugar de un directorio de enlaces. Algo como:

     # Your-external "mylib", add GLOBAL if the imported library is located in directories above the current. add_library( mylib SHARED IMPORTED ) # You can define two import-locations: one for debug and one for release. set_target_properties( mylib PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/res/mylib.so ) 

    Y luego enlace como si esta biblioteca fuera construida por su proyecto:

     TARGET_LINK_LIBRARIES(GLBall mylib) 

    Este enfoque le daría un poco más de flexibilidad: eche un vistazo al comando add_library () y a las muchas propiedades de destino relacionadas con las bibliotecas importadas .

    No sé si esto resolverá su problema con “versiones actualizadas de libs”.

    Supongo que desea vincular a una biblioteca llamada foo , su nombre de archivo suele ser algo relacionado con foo.dll o libfoo.so .

    1. Encuentra la biblioteca
    Tienes que encontrar la biblioteca. Esta es una buena idea, incluso si conoce la ruta a su biblioteca. CMake producirá un error si la biblioteca se desvanece o si recibe un nuevo nombre. Esto ayuda a detectar el error temprano y dejar en claro para el usuario (puede usted mismo) qué causa un problema.
    Para buscar una biblioteca foo y almacenar la ruta en FOO_LIB use

      find_library(FOO_LIB foo) 

    CMake se dará cuenta de cómo es el nombre real del archivo. Comprueba los lugares habituales como /usr/lib , /usr/lib64 y las rutas en PATH .

    Ya sabes la ubicación de tu biblioteca. Añádelo a CMAKE_PREFIX_PATH cuando llame a CMake, luego CMake buscará su biblioteca también en las rutas pasadas.

    A veces necesita agregar sugerencias o sufijos de ruta, consulte la documentación para obtener más información: https://cmake.org/cmake/help/latest/command/find_library.html

    2. Enlace la biblioteca Desde 1. tiene el nombre completo de la biblioteca en FOO_LIB . Usted usa esto para vincular la biblioteca a su objective mylib como en

      target_link_libraries(mylib "${FOO_LIB}") 

    Es posible que desee agregar PRIVATE , PUBLIC o INTERFACE al frente de la biblioteca, cf. la documentación: https://cmake.org/cmake/help/latest/command/target_link_libraries.html

    3. Agregar incluye (Este paso puede no ser obligatorio).
    Si también desea incluir archivos de encabezado, use find_path similar a find_library y busque un archivo de encabezado. A continuación, agregue el directorio de inclusión con target_include_directories similar a target_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 y find_path por find_package .

    Una alternativa más, en el caso de que esté trabajando con la AppStore, necesita “Derechos” y, como tal, debe vincularse con un Apple-Framework.

    Para que los derechos funcionen (por ejemplo, GameCenter), debe tener un “enlace binario con bibliotecas” -buildstep y luego vincularlo con “GameKit.framework”. CMake “inyecta” las bibliotecas en un “nivel bajo” en la línea de comandos, por lo tanto, Xcode no sabe realmente al respecto, y como tal, no se 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 manera que a XCode le gusta …

    El script se ve así (para Xcode 6.3.1).

     s#\/\* Begin PBXBuildFile section \*\/#\/\* Begin PBXBuildFile section \*\/\ 26B12AA11C10544700A9A2BA \/\* GameKit.framework in Frameworks \*\/ = {isa = PBXBuildFile; fileRef = 26B12AA01C10544700A9A2BA \/\* GameKit.framework xxx\*\/; };#g s#\/\* Begin PBXFileReference section \*\/#\/\* Begin PBXFileReference section \*\/\ 26B12AA01C10544700A9A2BA \/\* GameKit.framework xxx\*\/ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameKit.framework; path = System\/Library\/Frameworks\/GameKit.framework; sourceTree = SDKROOT; };#g s#\/\* End PBXFileReference section \*\/#\/\* End PBXFileReference section \*\/\ \ \/\* Begin PBXFrameworksBuildPhase section \*\/\ 26B12A9F1C10543B00A9A2BA \/\* Frameworks \*\/ = {\ isa = PBXFrameworksBuildPhase;\ buildActionMask = 2147483647;\ files = (\ 26B12AA11C10544700A9A2BA \/\* GameKit.framework in Frameworks xxx\*\/,\ );\ runOnlyForDeploymentPostprocessing = 0;\ };\ \/\* End PBXFrameworksBuildPhase section \*\/\ #g s#\/\* CMake PostBuild Rules \*\/,#\/\* CMake PostBuild Rules \*\/,\ 26B12A9F1C10543B00A9A2BA \/\* Frameworks xxx\*\/,#g s#\/\* Products \*\/,#\/\* Products \*\/,\ 26B12AA01C10544700A9A2BA \/\* GameKit.framework xxx\*\/,#g 

    guárdalo en “gamecenter.sed” y luego “aplícalo” así (¡cambia tu xcodeproj!)

     sed -i.pbxprojbak -f gamecenter.sed myproject.xcodeproj/project.pbxproj 

    Es posible que deba cambiar los comandos de secuencia de comandos para que se ajusten a sus necesidades.

    Advertencia: es probable que rompa con la versión de Xcode diferente, 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, así que a menos que necesites Soporte en la tienda de aplicaciones + Los derechos (y comstackciones automatizadas) no hacen esto.

    Este es un error CMake, consulte http://cmake.org/Bug/view.php?id=14185 y http://gitlab.kitware.com/cmake/cmake/issues/14185