Obviamente, você precisa colocar as bibliotecas que deseja onde eu coloco *boost libraries here*. Por exemplo, se você estiver usando a biblioteca filesysteme, regexescreveria:
Observe que você não precisa especificar componentes para bibliotecas apenas de cabeçalho, como lexical_cast. Portanto, você só precisa do comando find_packagee include_directories.
miguel.martin
1
No Windows, também pode ajudar adicionar isso ao seu arquivo cmake: ADD_DEFINITIONS (-DBOOST_ALL_NO_LIB), caso contrário, você pode executar stackoverflow.com/questions/28887680/…
Stéphane
é possível definir BOOST_USE_STATIC_LIBS para ON e Boost_USE_STATIC_RUNTIME OFF? & vice-verso.
lula de
5
O que isso *boost libraries here*significa?
IgorGanapolsky
2
Você também pode usar FIND_PACKAGE(Boost REQUIRED COMPONENTS system)se não souber a versão exata do impulso a ser usado
smac89
78
Você pode usar find_package para pesquisar por bibliotecas boost disponíveis. Ele adia a busca por Boost para FindBoost.cmake , que é instalado por padrão com o CMake.
Ao encontrar Boost, a find_package()chamada terá preenchido muitas variáveis (verifique a referência para FindBoost.cmake ). Entre eles estão as BOOST_INCLUDE_DIRSvariáveis Boost_LIBRARIES e Boost_XXX_LIBRARY, com XXX substituído por bibliotecas Boost específicas. Você pode usá-los para especificar include_directories e target_link_libraries .
Por exemplo, suponha que você precise boost :: program_options e boost :: regex, você faria algo como:
find_package(Boost REQUIRED COMPONENTS program_options regex )
include_directories( ${Boost_INCLUDE_DIRS})
add_executable( run main.cpp )# Example application based on main.cpp# Alternatively you could use ${Boost_LIBRARIES} here.
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY})
Algumas dicas gerais:
Ao pesquisar, FindBoost verifica a variável de ambiente $ ENV {BOOST_ROOT}. Você pode definir essa variável antes de chamar find_package, se necessário.
Quando você tem várias versões de build do boost (multi-threaded, estático, compartilhado, etc.), você pode especificar a configuração desejada antes de chamar find_package. Fazer isso definindo algumas das seguintes variáveis para On: Boost_USE_STATIC_LIBS, Boost_USE_MULTITHREADED,Boost_USE_STATIC_RUNTIME
Ao pesquisar Boost no Windows, tome cuidado com a vinculação automática. Leia a "NOTA para usuários do Visual Studio" na referência .
Meu conselho é desabilitar o link automático e usar o tratamento de dependência do cmake: add_definitions( -DBOOST_ALL_NO_LIB )
Em alguns casos, você pode precisar especificar explicitamente que um Boost dinâmico é usado: add_definitions( -DBOOST_ALL_DYN_LINK )
Observe que não é mais necessário especificar os diretórios de inclusão manualmente, uma vez que isso já é feito através dos destinos importados Boost::filesysteme Boost::regex. regexe filesystempode ser substituído por qualquer biblioteca de impulso que você precisar.
Como isso ficaria se você quisesse dizer para vincular a todo impulso? Quer dizer, sem listar todas as bibliotecas que existem no boost.
Toby Brull
4
Se você usar apenas partes do boost, apenas 'Boost :: boost' será suficiente. Todas as bibliotecas de reforço compiladas devem ser especificadas explicitamente.
oLen
2
@oLen Onde encontro uma lista de todos os destinos cmake Boost :: * importados? Como posso saber para qual devo vincular?
Markus
8
Isso pode ser útil para algumas pessoas. Eu tive um erro impertinente:
referência indefinida ao símbolo '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0: erro ao adicionar símbolos: DSO ausente na linha de comando
Houve algum problema de cmakeList.txt e de alguma forma estava faltando incluir explicitamente as bibliotecas "sistema" e "sistema de arquivos". Então, eu escrevi essas linhas em CMakeLists.txt
Essas linhas são escritas no início, antes de criar o executável do projeto, pois neste estágio não precisamos vincular a biblioteca boost ao executável do nosso projeto.
Eu concordo com as respostas 1 e 2 . No entanto, prefiro especificar cada biblioteca separadamente. Isso torna as dependências mais claras em grandes projetos. No entanto, existe o perigo de erros de digitação dos nomes das variáveis (diferenciando maiúsculas de minúsculas). Nesse caso, não há erro cmake direto, mas alguns problemas do linker de referências indefinidas posteriormente, que podem levar algum tempo para serem resolvidos. Portanto, uso a seguinte função cmake:
function(VerifyVarDefined)
foreach(lib ${ARGV})if(DEFINED ${lib})else(DEFINED ${lib})
message(SEND_ERROR "Variable ${lib} is not defined")
endif(DEFINED ${lib})
endforeach()
endfunction(VerifyVarDefined)
Para o exemplo mencionado acima, isso se parece com:
VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARYBoost_REGEX_LIBRARY)
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY})
Se eu tivesse escrito "BOOST_PROGRAM_OPTIONS_LIBRARY", teria ocorrido um erro acionado por cmake e não muito depois acionado pelo vinculador.
Respostas:
Coloque isso em seu
CMakeLists.txt
arquivo (altere as opções de DESATIVADO para ATIVADO, se desejar):Obviamente, você precisa colocar as bibliotecas que deseja onde eu coloco
*boost libraries here*
. Por exemplo, se você estiver usando a bibliotecafilesystem
e,regex
escreveria:fonte
lexical_cast
. Portanto, você só precisa do comandofind_package
einclude_directories
.*boost libraries here*
significa?FIND_PACKAGE(Boost REQUIRED COMPONENTS system)
se não souber a versão exata do impulso a ser usadoVocê pode usar find_package para pesquisar por bibliotecas boost disponíveis. Ele adia a busca por Boost para FindBoost.cmake , que é instalado por padrão com o CMake.
Ao encontrar Boost, a
find_package()
chamada terá preenchido muitas variáveis (verifique a referência para FindBoost.cmake ). Entre eles estão asBOOST_INCLUDE_DIRS
variáveis Boost_LIBRARIES e Boost_XXX_LIBRARY, com XXX substituído por bibliotecas Boost específicas. Você pode usá-los para especificar include_directories e target_link_libraries .Por exemplo, suponha que você precise boost :: program_options e boost :: regex, você faria algo como:
Algumas dicas gerais:
On
:Boost_USE_STATIC_LIBS
,Boost_USE_MULTITHREADED
,Boost_USE_STATIC_RUNTIME
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
fonte
Adaptando a resposta de @LainIwakura para a sintaxe moderna do CMake com destinos importados, isso seria:
Observe que não é mais necessário especificar os diretórios de inclusão manualmente, uma vez que isso já é feito através dos destinos importados
Boost::filesystem
eBoost::regex
.regex
efilesystem
pode ser substituído por qualquer biblioteca de impulso que você precisar.fonte
Isso pode ser útil para algumas pessoas. Eu tive um erro impertinente: referência indefinida ao símbolo '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0: erro ao adicionar símbolos: DSO ausente na linha de comando Houve algum problema de cmakeList.txt e de alguma forma estava faltando incluir explicitamente as bibliotecas "sistema" e "sistema de arquivos". Então, eu escrevi essas linhas em CMakeLists.txt
Essas linhas são escritas no início, antes de criar o executável do projeto, pois neste estágio não precisamos vincular a biblioteca boost ao executável do nosso projeto.
Agora, no final do arquivo, escrevi essas linhas considerando "KeyPointEvaluation" como o executável do meu projeto.
fonte
Eu concordo com as respostas 1 e 2 . No entanto, prefiro especificar cada biblioteca separadamente. Isso torna as dependências mais claras em grandes projetos. No entanto, existe o perigo de erros de digitação dos nomes das variáveis (diferenciando maiúsculas de minúsculas). Nesse caso, não há erro cmake direto, mas alguns problemas do linker de referências indefinidas posteriormente, que podem levar algum tempo para serem resolvidos. Portanto, uso a seguinte função cmake:
Para o exemplo mencionado acima, isso se parece com:
Se eu tivesse escrito "BOOST_PROGRAM_OPTIONS_LIBRARY", teria ocorrido um erro acionado por cmake e não muito depois acionado pelo vinculador.
fonte
Tente dizer a documentação do Boost :
Não se esqueça de substituir foo pelo nome do projeto e componentes pelo seu!
fonte