Eu sou novo no CMake e um pouco confuso com as palavras-chave PUBLIC, PRIVATE e INTERFACE relacionadas a target_link_libraries()
. A documentação menciona que eles podem ser usados para especificar as dependências do link e a interface do link em um comando.
O que realmente significam as dependências e a interface do link?
Respostas:
Se você estiver criando uma biblioteca compartilhada e seus arquivos cpp de origem # incluem os cabeçalhos de outra biblioteca (digamos, QtNetwork por exemplo), mas seus arquivos de cabeçalho não incluem cabeçalhos QtNetwork, então QtNetwork é uma
PRIVATE
dependência.Se seus arquivos de origem e seus cabeçalhos incluem os cabeçalhos de outra biblioteca, então é uma
PUBLIC
dependência.Se seus arquivos de cabeçalho, mas não seus arquivos de origem, incluem os cabeçalhos de outra biblioteca, então é uma
INTERFACE
dependência.Outras propriedades de construção
PUBLIC
eINTERFACE
dependências são propagadas para as bibliotecas de consumo. http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirementsfonte
PUBLIC
ouPRIVATE
importa? O que isso muda?PRIVATE
não adiciona suas dependências a projetos vinculados à sua biblioteca. É mais limpo e também evita possíveis conflitos entre suas dependências e as do usuário.PUBLIC
dependência, não umaINTERFACE
dependência.A resposta aceita de @steveire é ótima. Eu só queria adicionar uma tabela para ver rapidamente a diferença:
fonte
Algumas respostas diziam apenas quando usar PRIVATE / PUBLIC / INTERFACE, mas os efeitos são ignorados. Consulte: CMake-Public-Private-Interface
PUBLIC
Todos os objetos que seguem PUBLIC serão usados para vincular ao destino atual e fornecer a interface para os outros destinos que possuem dependências do destino atual.
PRIVATE
Todos os objetos que seguem PRIVATE serão usados apenas para vincular ao alvo atual.
INTERFACE
Todos os objetos que seguem INTERFACE serão usados apenas para fornecer a interface para os outros destinos que possuem dependências no destino atual.
fonte