Link CMake para biblioteca externa

Como obter o CMake para vincular um executável a uma biblioteca compartilhada externa que não é construída dentro do mesmo projeto CMake?

Apenas fazendo target_link_libraries(GLBall ${CMAKE_BINARY_DIR}/res/mylib.so) dá o erro

 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) 

depois que eu copiei a biblioteca para o bin/res .

Eu tentei usar find_library(RESULT mylib.so PATHS ${CMAKE_BINARY_DIR}/res)

Que falha com RESULT-NOTFOUND .

    Primeiro, defina o caminho de pesquisa das bibliotecas:

     LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/res) 

    E então apenas faça

     TARGET_LINK_LIBRARIES(GLBall mylib) 

    A resposta do arrowdodger é correta e preferida em muitas ocasiões. Gostaria apenas de acrescentar uma alternativa à sua resposta:

    Você pode adicionar um destino de biblioteca “importado”, em vez de um diretório de link. 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 ) 

    E, em seguida, vincule como se essa biblioteca fosse criada pelo seu projeto:

     TARGET_LINK_LIBRARIES(GLBall mylib) 

    Essa abordagem lhe daria um pouco mais de flexibilidade: dê uma olhada no comando add_library () e nas muitas propriedades de destino relacionadas a bibliotecas importadas .

    Não sei se isso resolverá seu problema com “versões atualizadas de libs”.

    Eu suponho que você deseja vincular a uma biblioteca chamada foo , seu nome de arquivo é geralmente algo link foo.dll ou libfoo.so .

    1. Encontre a biblioteca
    Você tem que encontrar a biblioteca. Essa é uma boa ideia, mesmo que você saiba o caminho para sua biblioteca. CMake irá errar se a biblioteca desapareceu ou recebeu um novo nome. Isso ajuda a identificar erros precocemente e deixar claro para o usuário (pode você mesmo) o que causa um problema.
    Para encontrar uma biblioteca foo e armazenar o caminho no uso de FOO_LIB

      find_library(FOO_LIB foo) 

    O CMake descobrirá como é o nome real do arquivo. Ele verifica os locais usuais como /usr/lib , /usr/lib64 e os caminhos no PATH .

    Você já sabe a localização da sua biblioteca. Adicione-o ao CMAKE_PREFIX_PATH quando você chamar o CMake e, em seguida, o CMake procurará sua biblioteca nos caminhos passados ​​também.

    Às vezes, você precisa adicionar dicas ou sufixos de caminho. Consulte a documentação para obter detalhes: https://cmake.org/cmake/help/latest/command/find_library.html

    2. Vincule a biblioteca A partir de 1. você tem o nome completo da biblioteca em FOO_LIB . Você usa isso para vincular a biblioteca ao seu destino mylib como em

      target_link_libraries(mylib "${FOO_LIB}") 

    Você pode querer adicionar PRIVATE , PUBLIC ou INTERFACE na frente da biblioteca, cf. a documentação: https://cmake.org/cmake/help/latest/command/target_link_libraries.html

    3. Incluir inclusões (essa etapa pode não ser obrigatória).
    Se você também quiser include arquivos de header, use find_path semelhante a find_library e procure por um arquivo de header. Em seguida, adicione o diretório de inclusão com target_include_directories semelhantes a target_link_libraries .

    Documentação: https://cmake.org/cmake/help/latest/command/find_path.html e https://cmake.org/cmake/help/latest/command/target_include_directories.html

    Se disponível para o software externo, você pode replace find_library e find_path por find_package .

    Outra alternativa, no caso de você estar trabalhando com a Appstore, precisa de “Entitlements” e, como tal, precisa vincular-se a um Apple-Framework.

    Para que os direitos funcionem (por exemplo, GameCenter), você precisa ter um “link binário com bibliotecas” -buildstep e, em seguida, vincular com “GameKit.framework”. O CMake “injeta” as bibliotecas em um “nível baixo” na linha de comando, portanto, o Xcode realmente não sabe disso e, como tal, você não terá o GameKit ativado na canvas de Recursos.

    Uma maneira de usar o CMake e ter um “Link com Binários” – buildstep é gerar o xcodeproj com o CMake, e então usar ‘sed’ para ‘procurar e replace’ e adicionar o GameKit na forma como o XCode gosta …

    O script é assim (para o 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 

    salve isso em “gamecenter.sed” e, em seguida, “aplique” assim (isso muda o xcodeproj!)

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

    Você pode ter que alterar os comandos de script para atender às suas necessidades.

    Aviso: é provável que ele quebre com a versão diferente do Xcode, pois o formato do projeto pode mudar, o número exclusivo (codificado) pode não ser exclusivo – e geralmente as soluções de outras pessoas são melhores – a menos que você precise Apoiar a Appstore + Direitos (e compilações automatizadas), não faça isso.

    Este é um erro do CMake, veja http://cmake.org/Bug/view.php?id=14185 e http://gitlab.kitware.com/cmake/cmake/issues/14185