Estou tentando configurar um projeto usando o CMake, mas não consigo encontrar as bibliotecas Boost, embora elas estejam na pasta especificada. Especifiquei Boost_INCLUDE_DIR
, Boost_LIBRARYDIR
e BOOST_ROOT
, mas ainda recebo um erro dizendo que o CMake não foi capaz de encontrar o Boost. Qual poderia ser o motivo de tal erro?
87
Boost_INCLUDE_DIR
e outras usam o sinalizadorBoost_INCLUDEDIR
( sem o sublinhado ). Você pode verificar a pessoa certa para o seu caso lendo oFindBoost.cmake
arquivo, empath-to-cmake/Modules/FindBoost.cmake
find_package(Boost CONFIG)
Respostas:
Tem certeza de que está fazendo da maneira correta? A ideia é que o CMake configure
BOOST_INCLUDE_DIR
,BOOST_LIBRARYDIR
eBOOST_ROOT
automaticamente. Faça algo assim emCMakeLists.txt
:FIND_PACKAGE(Boost) IF (Boost_FOUND) INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR}) ADD_DEFINITIONS( "-DHAS_BOOST" ) ENDIF()
Se o boost não estiver instalado em um local padrão e não puder, portanto, ser encontrado pelo CMake, você pode dizer ao CMake onde procurar por boost como este:
SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost") SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")
Claro, essas duas linhas tem que ser antes de o
FIND_PACKAGE(Boost)
noCMakeLists.txt
.fonte
${Boost_INCLUDE_DIR}
não${BOOST_INCLUDE_DIR}
, caso importa.BOOST_INCLUDEDIR
'?Há mais ajuda disponível lendo o
FindBoost.cmake
próprio arquivo. Ele está localizado no diretório 'Módulos'.Um bom começo é
set(Boost_DEBUG 1)
- isso vai cuspir muitas informações sobre onde o boost está procurando, o que está procurando e pode ajudar a explicar por que ele não consegue encontrá-lo.Também pode ajudá-lo a descobrir se ele está pegando você
BOOST_ROOT
corretamente.FindBoost.cmake
também às vezes tem problemas se a versão exata do aumento não estiver listada nas variáveis de Versões disponíveis. Você pode encontrar mais sobre isso lendoFindBoost.cmake
.Por último,
FindBoost.cmake
teve alguns bugs no passado. Uma coisa que você pode tentar é pegar uma versão mais recente daFindBoost.cmake
última versão do CMake e colocá-la na pasta do projeto ao ladoCMakeLists.txt
- então, mesmo se você tiver uma versão antiga do boost, ele usará a nova versãoFindBoost.cmake
que está em pasta do seu projeto.Boa sorte.
fonte
Eu mesma lutei com esse problema por um tempo. Descobriu-se que
cmake
estava procurando por arquivos de biblioteca Boost usando a convenção de nomenclatura do Boost, em que o nome da biblioteca é uma função da versão do compilador usada para criá-la. Nossas bibliotecas Boost foram construídas usandoGCC 4.9.1
, e essa versão do compilador estava de fato presente em nosso sistema; no entanto,GCC 4.4.7
também foi instalado. Acontece que oFindBoost.cmake
script do cmake estava detectando automaticamente aGCC 4.4.7
instalação em vez deGCC 4.9.1
uma e, portanto, estava procurando os arquivos da biblioteca Boost com "gcc44
" nos nomes dos arquivos, em vez de "gcc49
".A correção simples foi forçar o cmake a assumir que o GCC 4.9 estava presente, definindo
Boost_COMPILER
como "-gcc49
" emCMakeLists.txt
. Com esta mudança,FindBoost.cmake
procurei e encontrei meus arquivos de biblioteca Boost.fonte
Você também pode especificar a versão do Boost que gostaria que o CMake usasse, passando
-DBOOST_INCLUDEDIR
ou-DBOOST_ROOT
apontando para a localização dos cabeçalhos de boost da versão corretaExemplo:
cmake -DBOOST_ROOT=/opt/latestboost
Isso também será útil quando várias versões de reforço estiverem no mesmo sistema.
fonte
Eu também tive um problema semelhante e descobri que as variáveis de env BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR e BOOST_ROOT devem conter caminhos absolutos . HTH!
fonte
Tive o mesmo problema ao tentar executar
make
um projeto após instalar o Boost versão 1.66.0 no Ubuntu Trusty64. A mensagem de erro era semelhante (não exatamente como) esta:CMake Error at /usr/local/Cellar/cmake/3.3.2/share/cmake/Modules/FindBoost.cmake:1245 (message): Unable to find the requested Boost libraries. Boost version: 0.0.0 Boost include path: /usr/include Detected version of Boost is too old. Requested version was 1.36 (or newer). Call Stack (most recent call first): CMakeLists.txt:10 (FIND_PACKAGE)
O Boost foi definitivamente instalado, mas o CMake não conseguiu detectá-lo. Depois de passar muito tempo mexendo em caminhos e variáveis ambientais, acabei me examinando
cmake
em busca de opções e encontrei o seguinte:Então, executei o seguinte no diretório em questão:
sudo cmake --check-system-vars
que retornou:
Also check system files when warning about unused and uninitialized variables. -- Boost version: 1.66.0 -- Found the following Boost libraries: -- system -- filesystem -- thread -- date_time -- chrono -- regex -- serialization -- program_options -- Found Git: /usr/bin/git -- Configuring done -- Generating done -- Build files have been written to: /home/user/myproject
e resolveu o problema.
fonte
Para a versão cmake
3.1.0-rc2
pegar,boost 1.57
especifique-D_boost_TEST_VERSIONS=1.57
cmake version 3.1.0-rc2
o padrãoboost<=1.56.0
é como é visto usando-DBoost_DEBUG=ON
cmake -D_boost_TEST_VERSIONS=1.57 -DBoost_DEBUG=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
fonte
Se você está construindo seu próprio boost não se esqueça de usar o
--layout=versioned
caso contrário a busca por uma versão particular da biblioteca irá falharfonte
Mais um conselho para quem está tentando construir CGAL em particular, com Boost estaticamente vinculado. Não basta definir
Boost_USE_STATIC_LIBS
; ele é sobrescrito pela hora em queBoost_DEBUG
produz seu valor. A única coisa a fazer aqui é marcar a caixa de seleção "Avançado" e habilitá-laCGAL_Boost_USE_STATIC_LIBS
.fonte
Eu tive o mesmo problema e nenhuma das soluções acima funcionou. Na verdade, o arquivo
include/boost/version.hpp
não pôde ser lido (pelo script cmake iniciado por jenkins).Tive que alterar manualmente a permissão da biblioteca (boost) (embora jenkins pertença ao grupo, mas esse é outro problema vinculado a jenkins que não consegui descobrir):
chmod o+wx ${BOOST_ROOT} -R # allow reading/execution on the whole library #chmod g+wx ${BOOST_ROOT} -R # this did not suffice, strangely, but it is another story I guess
fonte
Isso também pode acontecer se
CMAKE_FIND_ROOT_PATH
for definido como diferente deBOOST_ROOT
. Enfrentei o mesmo problema que apesar de configurarBOOST_ROOT
, estava recebendo o erro. Mas para compilação cruzada para ARM eu estava usando o Toolchain-android.cmake no qual eu tinha (por algum motivo):set(BOOST_ROOT "/home/.../boost") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${SYSROOT}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/include/libcxx") set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}") set(CMAKE_FIND_ROOT_PATH "${SYSROOT}")
CMAKE_FIND_ROOT_PATH
parece estar substituindo oBOOST_ROOT
que estava causando o problema.fonte
Talvez
Ajudará você.
fonte