Há cerca de um ano, perguntei sobre dependências de cabeçalho no CMake .
Percebi recentemente que o problema parecia ser que o CMake considerava esses arquivos de cabeçalho externos ao projeto. Pelo menos, ao gerar um projeto Code :: Blocks, os arquivos de cabeçalho não aparecem no projeto (os arquivos de origem). Portanto, parece-me que o CMake considera esses cabeçalhos externos ao projeto e não os rastreia nas dependências.
Uma pesquisa rápida no tutorial do CMake apenas apontou para o include_directories
que parece não fazer o que eu desejo ...
Qual é a maneira correta de sinalizar ao CMake que um diretório específico contém cabeçalhos a serem incluídos e que esses cabeçalhos devem ser rastreados pelo Makefile gerado?
.cbp
arquivo do projeto. Agora, se o scanner de dependência cmake falhar na identificação correta de um arquivo de cabeçalho como uma dependência para um Makefile, existem maneiras de corrigir isso, mas em alguns casos ele irá errar porque não inclui um pré-processador completo.Respostas:
Duas coisas devem ser feitas.
Primeiro adicione o diretório a ser incluído:
Caso você esteja com uma versão CMake muito antiga (2.8.10 ou anterior) sem suporte
target_include_directories
, também poderá usar o legadoinclude_directories
:Em seguida, você também deve adicionar os arquivos de cabeçalho à lista dos arquivos de origem do destino atual, por exemplo:
Dessa forma, os arquivos de cabeçalho aparecerão como dependências no Makefile e também, por exemplo, no projeto do Visual Studio gerado, se você gerar um.
Como usar esses arquivos de cabeçalho para vários destinos:
fonte
LIBROOT_HEADER_FILES
variável inliba/CMakefile
elibb/CMakefile
then?include_directories
novotarget_include_directories
. O primeiro define recursivamente para todos os destinos nesse diretório; enquanto o último o define como um alvo. Fazer isso quebra a noção de um gráfico de destino no CMake e, em vez disso, conta com efeitos colaterais na hierarquia de arquivos.target_include_directories
pelo código CMake moderno. Sinta-se à vontade para me convidar para um bate-papo se não concordar com as alterações.Primeiro, você
include_directories()
pode dizer ao CMake para adicionar o diretório-I
à linha de comando da compilação. Segundo, você lista os cabeçalhos na sua chamadaadd_executable()
ouadd_library()
.Por exemplo, se as fontes do seu projeto estiverem dentro
src
e você precisar de cabeçalhosinclude
, poderá fazer o seguinte:fonte
add_executable
? Eu pensei que o CMake descobriu as dependências do arquivo de inclusão automaticamente.O CMake é mais como uma linguagem de script se comparada com outras maneiras de criar Makefile (por exemplo, make ou qmake). Não é muito legal como o Python, mas ainda assim.
Não existe uma " maneira adequada " se procurar em vários projetos de código aberto como as pessoas incluem diretórios. Mas existem duas maneiras de fazer isso.
Os include_directories brutos anexarão um diretório ao projeto atual e a todos os outros projetos descendentes que você anexará por meio de uma série de comandos add_subdirectory . Às vezes, as pessoas dizem que essa abordagem é legada.
Uma maneira mais elegante é com o target_include_directories . Ele permite anexar um diretório para um projeto / destino específico sem (talvez) herança desnecessária ou conflito de vários diretórios de inclusão. Também permita executar uma configuração sutil e acrescente um dos seguintes marcadores a este comando.
PRIVATE - use apenas para este destino de construção especificado
PUBLIC - use-o para o destino especificado e para destinos vinculados a este projeto
INTERFACE - use-o apenas para destinos vinculados ao projeto atual
PS:
Ambos os comandos permitem marcar um diretório como SYSTEM para dar uma dica de que não é da sua conta que os diretórios especificados contenham avisos.
Uma resposta semelhante é com outros pares de comandos target_compile_definitions / add_definitions , target_compile_options / CMAKE_C_FLAGS
fonte
Adicionar
include_directories("/your/path/here")
.Isso será semelhante a chamar
gcc
com a-I/your/path/here/
opçãoColoque aspas duplas no caminho. Outras pessoas não mencionaram isso e isso me deixou presa por 2 dias. Portanto, esta resposta é para pessoas que são muito novas no CMake e muito confusas.
fonte
Eu tive o mesmo problema.
Meu diretório de projeto era assim:
E o que eu costumava incluir os arquivos em todas essas pastas:
E funcionou totalmente.
fonte