Eu tenho uma estrutura de diretório para o meu código C ++ que é assim:
|
|->include
|->src
Estou escrevendo um arquivo CMakeLists.txt para o meu código. Eu quero entender a diferença entre include_directories
e target_include_directories
em CMake
.
Qual é a diferença entre o uso e para adicionar o caminho do arquivo de inclusão que devo usar?
include_directories
etarget_include_directories
? O que você não entende sobre a diferença entre eles?Respostas:
include_directories(x/y)
afeta o escopo do diretório. Todos os destinos neste CMakeList, bem como aqueles em todos os subdiretórios adicionados após o ponto de sua chamada, terão o caminhox/y
adicionado ao seu caminho de inclusão.target_include_directories(t x/y)
tem escopo de destino - ele adicionax/y
ao caminho de inclusão do destinot
.Você deseja o primeiro se todos os seus destinos usarem os diretórios de inclusão em questão. Você deseja o último se o caminho for específico para um destino ou se desejar um controle mais preciso da visibilidade do caminho. Este último vem do fato de que
target_include_directories()
suporta osPRIVATE
,PUBLIC
eINTERFACE
qualificadores.fonte
x/y
incluir o caminho de inclusão de qualquer destino dependente que uset
em seustarget_link_libraries
comandos. É claro que há um lugar para o primeiro, mas acredito que o último seja geralmente melhor.include_directories
serão afetados. Estou editando a resposta: a documentação afirma claramente que todos os alvos nas CMakeLists atuais são afetados. A documentação não menciona, mas apenas subdirs depois da chamada são afetados (como foi correctamente indicado na resposta original)target_include_directories
foi introduzido no CMake 2.8.11 (maio de 2013)Ao lado do que a resposta de Angew diz corretamente, outra diferença muito importante entre
include_directories
etarget_include_directories
é que, quando usado comPUBLIC
ouINTERFACE
, o último preenche aINTERFACE_INCLUDE_DIRECTORIES
propriedade do alvo. Essa propriedade é útil quando outro destino usatarget_link_libraries
para vincular ao destino original, pois o destino de vinculação terá automaticamente os diretórios incluídos. Veja exemplo .Esse recurso importante está muito bem oculto na documentação: target_include_directories menciona preenchimento
INTERFACE_INCLUDE_DIRECTORIES
, cuja documentação diz:fonte
PUBLIC
propriedades etc.! Obrigado: DComo o @Angew disse, a grande diferença é:
1, include_directories () é acessível para todos os arquivos na árvore de origem 2, target_include_directories () é acessível apenas para um destino específico durante a compilação.
fonte