Eu escrevi uma biblioteca que costumava compilar usando um Makefile auto-escrito, mas agora quero mudar para cmake. A árvore fica assim (removi todos os arquivos irrelevantes):
.
├── include
│ ├── animation.h
│ ├── buffers.h
│ ├── ...
│ ├── vertex.h
│ └── world.h
└── src
├── animation.cpp
├── buffers.cpp
├── ...
├── vertex.cpp
└── world.cpp
Então, o que estou tentando fazer é apenas compilar a fonte em uma biblioteca compartilhada e instalá-la com os arquivos de cabeçalho.
Muitos exemplos que encontrei executáveis de compilação com algumas bibliotecas compartilhadas, mas nunca apenas uma biblioteca compartilhada simples. Também seria útil se alguém pudesse me dizer uma biblioteca muito simples que usa cmake, para que eu possa usar isso como um exemplo.
c++
compilation
cmake
shared-libraries
Florian M
fonte
fonte
Respostas:
Sempre especifique a versão mínima exigida do
cmake
Você deve declarar um projeto.
cmake
diz que é obrigatória e vai definir variáveis convenientesPROJECT_NAME
,PROJECT_VERSION
ePROJECT_DESCRIPTION
(esta última necessitate variável cmake 3.9):Declare um novo destino de biblioteca. Por favor, evite o uso de
file(GLOB ...)
. Esse recurso não fornece o domínio do processo de compilação. Se você é preguiçoso, copie e cole a saída dels -1 sources/*.cpp
:Defina a
VERSION
propriedade (opcional, mas é uma boa prática):Você também pode definir
SOVERSION
um número principal deVERSION
. Entãolibmylib.so.1
será um link simbólico paralibmylib.so.1.0.0
.Declare a API pública da sua biblioteca. Essa API será instalada para o aplicativo de terceiros. É uma boa prática isolá-lo na árvore de projetos (como colocá-lo no
include/
diretório). Observe que cabeçalhos privados não devem ser instalados e eu sugiro colocá-los com os arquivos de origem.Se você trabalha com subdiretórios, não é muito conveniente incluir caminhos relativos como
"../include/mylib.h"
. Portanto, passe um diretório superior nos diretórios incluídos:ou
Crie uma regra de instalação para sua biblioteca. Sugiro usar variáveis
CMAKE_INSTALL_*DIR
definidas emGNUInstallDirs
:E declare os arquivos para instalar:
Você também pode exportar um
pkg-config
arquivo. Este arquivo permite que um aplicativo de terceiros importe facilmente sua biblioteca:pkg-config
PKG_CHECK_MODULES
pkg_check_modules
Crie um arquivo de modelo chamado
mylib.pc.in
(consulte a página de manual do pc (5) para obter mais informações):No seu
CMakeLists.txt
, adicione uma regra para expandir@
macros (@ONLY
peça ao cmake para não expandir variáveis do formulário${VAR}
):E, finalmente, instale o arquivo gerado:
Você também pode usar o recurso cmake
EXPORT
. No entanto, esse recurso é compatível apenascmake
e acho difícil de usar.Finalmente, o conjunto
CMakeLists.txt
deve se parecer com:fonte
mkdir build && cd build/ && cmake .. && sudo make install
(ousudo make install/strip
para instalar a versão distribuída da biblioteca)..pc
arquivo, adicioneRequires: liblog4cxx
ao seumylib.pc
, caso contrário, você pode simplesmente adicionar-llog4cxx
aoLibs:
.Esse
CMakeLists.txt
arquivo mínimo compila uma biblioteca compartilhada simples:No entanto, não tenho experiência em copiar arquivos para um destino diferente com o CMake. O comando file com a assinatura COPY / INSTALL parece ser útil.
fonte
${CMAKE_CURRENT_SOURCE_DIR}/
eminclude_directories
é útil?Estou tentando aprender como fazer isso sozinho, e parece que você pode instalar a biblioteca assim:
fonte
Primeiro, este é o layout do diretório que estou usando:
Depois de alguns dias analisando isso, esta é a minha maneira favorita de fazer isso, graças ao CMake moderno:
Após executar o CMake e instalar a biblioteca, não há necessidade de usar os arquivos Find ***. Cmake, eles podem ser usados assim:
É isso, se tiver sido instalado em um diretório padrão, ele será encontrado e não será necessário fazer mais nada. Se ele foi instalado em um caminho não padrão, também é fácil, basta dizer ao CMake onde encontrar o MyLibConfig.cmake usando:
Espero que isso ajude a todos, tanto quanto me ajudou. As velhas maneiras de fazer isso eram bastante complicadas.
fonte