Como fazer com que o CMake vincule um executável a uma biblioteca compartilhada externa que não é criada no mesmo projeto do 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 no diretório binário bin/res
.
Eu tentei usar find_library(RESULT mylib.so PATHS ${CMAKE_BINARY_DIR}/res)
O que falha com RESULT-NOTFOUND
.
link_directories
é desencorajado, mesmo em sua própria documentação. Eu acho que seria melhor aqui resolver afind_library
chamada que falhou na pergunta original ou usar a solução de @ Andre.find_library
e usar esse caminho em vez de codificá-lo, cf. a minha resposta .A resposta de arrowdodger é correta e preferida em várias ocasiões. Eu simplesmente gostaria de adicionar uma alternativa à sua resposta:
Você pode adicionar um destino de biblioteca "importado", em vez de um diretório de link. Algo como:
E, em seguida, vincule como se essa biblioteca tivesse sido criada por seu projeto:
Essa abordagem daria a você um pouco mais de flexibilidade: Dê uma olhada no comando add_library () e nas muitas propriedades de destino relacionadas às bibliotecas importadas .
Não sei se isso resolverá o seu problema com "versões atualizadas das bibliotecas".
fonte
add_library( mylib SHARED IMPORTED )
ou você recebe umadd_library called with IMPORTED argument but no library type
erroIMPORTED_LOCATION
o colchete de abertura está erradoGLOBAL
depoisIMPORTED
se quiser acessar a biblioteca importada em diretórios acima do atual:add_library(breakpad STATIC IMPORTED GLOBAL)
Suponho que você deseja vincular a uma biblioteca chamada foo , seu nome de arquivo é geralmente algo como link
foo.dll
oulibfoo.so
.1. Encontre a biblioteca
Você precisa encontrar a biblioteca. É uma boa ideia, mesmo se você souber o caminho para sua biblioteca. O CMake irá errar se a biblioteca desaparecer ou tiver um novo nome. Isso ajuda a detectar erros com antecedência e esclarecer ao usuário (você mesmo) o que causa um problema.
Para encontrar uma biblioteca foo e armazenar o caminho em
FOO_LIB
usoO CMake vai descobrir como é o nome do arquivo real. Ele verifica os lugares habituais, como
/usr/lib
,/usr/lib64
e os caminhos emPATH
.Você já sabe a localização da sua biblioteca. Adicione-o ao
CMAKE_PREFIX_PATH
quando você chamar o CMake; o CMake também procurará sua biblioteca nos caminhos passados.À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. Vincular a biblioteca A partir de 1. você tem o nome completo da biblioteca
FOO_LIB
. Você usa isso para vincular a biblioteca ao seu destino,GLBall
como emVocê deve adicionar
PRIVATE
,PUBLIC
ouINTERFACE
após o destino, cf. a documentação: https://cmake.org/cmake/help/latest/command/target_link_libraries.htmlSe você não adicionar um desses especificadores de visibilidade, ele se comportará como
PRIVATE
ouPUBLIC
, dependendo da versão do CMake e do conjunto de políticas.3. Adicionar inclusões (Esta etapa pode não ser obrigatória.)
Se você também deseja incluir arquivos de cabeçalho, use
find_path
semelhante afind_library
e procure um arquivo de cabeçalho. Em seguida, adicione o diretório include comtarget_include_directories
similar atarget_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 estiver disponível para o software externo, pode substituir
find_library
efind_path
porfind_package
.fonte
find_package
é muito mais simples do que seguir estas etapastarget_link_libraries(mylib "${FOO_LIB}")
? O alvo é, emmylib
vez de seu alvo realGLBall
,? não faz muito sentido para mimMais uma alternativa, no caso de você estar trabalhando com a Appstore, precisa de "Direitos" e, como tal, precisa se vincular a um Apple-Framework.
Para que os Direitos funcionem (por exemplo, GameCenter), você precisa ter um build "Vincular Binário com Bibliotecas" 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 sobre isso e, como tal, você não ativará o GameKit na tela Recursos.
Uma maneira de usar o CMake e ter um link "Link com binários" é gerar o xcodeproj com o CMake e, em seguida, usar 'sed' para 'pesquisar e substituir' e adicionar o GameKit da maneira que o XCode gosta ...
O script fica assim (para o Xcode 6.3.1).
salve-o em "gamecenter.sed" e, em seguida, "aplique-o" desta maneira (ele altera seu xcodeproj!)
Pode ser necessário alterar os comandos de script para atender às suas necessidades.
Aviso: é provável que seja diferente da versão do Xcode, pois o formato do projeto pode mudar, o número exclusivo (codificado) pode não ser realmente único - e geralmente as soluções de outras pessoas são melhores -, a menos que você precise oferecer suporte à Appstore + Direitos (e compilações automatizadas), não faça isso.
Este é um erro do CMake, consulte http://cmake.org/Bug/view.php?id=14185 e http://gitlab.kitware.com/cmake/cmake/issues/14185
fonte