Qual é o significado da palavra-chave PUBLIC
, PRIVATE
e INTERFACE
relacionado com CMake de target_include_directories
?
Respostas:
Essas palavras-chave são usadas para dizer quando a lista de diretórios de inclusão que você está passando para o destino é necessária. Por quando , isso significa que, se os incluir diretórios são necessários:
Quando CMake está compilando um alvo, ele usa os alvos INCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
e COMPILE_OPTIONS
propriedades. Quando você usa a PRIVATE
palavra - chave em target_include_directories()
e similares, diz ao CMake para preencher essas propriedades de destino.
Quando o CMake detecta uma dependência entre um alvo A e outro alvo B (como quando você usa o target_link_libraries(A B)
comando), ele propaga transitivamente os B
requisitos de uso para o A
alvo. Esses requisitos de uso de destino são os diretórios de inclusão, definições de compilação, etc. que qualquer destino que dependa B
deve atender. Eles são especificados pela INTERFACE_*
versão das propriedades listadas acima (como INTERFACE_INCLUDE_DIRECTORIES
) e são preenchidos usando a INTERFACE
palavra - chave ao chamar otarget_*()
comandos.
A PUBLIC
palavra-chave significa aproximadamente PRIVATE + INTERFACE
.
Portanto, suponha que você esteja criando uma biblioteca A
que usa alguns cabeçalhos Boost. Você faria:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
se você usar apenas esses cabeçalhos Boost dentro de seus arquivos de origem ( .cpp
) ou arquivos de cabeçalho privados ( .h
).target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
se você não usar esses cabeçalhos Boost dentro de seus arquivos de origem (portanto, não precisa deles para compilar A
). Na verdade, não consigo pensar em um exemplo do mundo real para isso.target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
se você usar esses cabeçalhos Boost em seus arquivos de cabeçalho públicos, que estão incluídos AMBOS em alguns dos A
arquivos de origem de e também podem ser incluídos em qualquer outro cliente de sua A
biblioteca.A documentação do CMake 3.0 tem mais detalhes sobre esta especificação de construção e propriedades de requisitos de uso .
INTERFACE
. target_include_directories(libname INTERFACE include PRIVATE include/libname)
. Isso significa que em sua biblioteca você pode incluir arquivos diretamente, mas como um usuário da biblioteca, você deve inserir libname/
primeiro.
target_include_directories()
um destino executável se precisar definir diretórios de inclusão onde os arquivos de cabeçalho usados por esses executáveis podem ser encontrados (por exemplo: Boost :: Program_options, se você usá-lo para analisar argumentos em sua main()
função) . Você provavelmente usaria a PRIVATE
palavra - chave neste caso, pois esses arquivos são necessários para compilar o próprio executável. Não sei se existe alguma utilidade para INTERFACE
ou PUBLIC
em um executável, no entanto.
As palavras-chave INTERFACE, PUBLIC e PRIVATE são necessárias para especificar o escopo dos seguintes argumentos. Os itens PRIVATE e PUBLIC irão preencher a propriedade INCLUDE_DIRECTORIES de <target>. Os itens PUBLIC e INTERFACE preencherão a propriedade INTERFACE_INCLUDE_DIRECTORIES de <destino>. Os seguintes argumentos especificam diretórios de inclusão.
Da documentação: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
Para reformular a documentação com minhas próprias palavras: