Cmake não encontra Boost

87

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_LIBRARYDIRe 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?

Ivan Gromov
fonte
Algumas versões do Boost usam o sinalizador Boost_INCLUDE_DIRe outras usam o sinalizador Boost_INCLUDEDIR( sem o sublinhado ). Você pode verificar a pessoa certa para o seu caso lendo o FindBoost.cmakearquivo, empath-to-cmake/Modules/FindBoost.cmake
marcelosalloum
Para sua informação, se você está ganhando impulso com o suporte do CMake, você deve usarfind_package(Boost CONFIG)
Dmitry Sazonov,

Respostas:

105

Tem certeza de que está fazendo da maneira correta? A ideia é que o CMake configure BOOST_INCLUDE_DIR, BOOST_LIBRARYDIRe BOOST_ROOTautomaticamente. Faça algo assim em CMakeLists.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)no CMakeLists.txt.

fschmitt
fonte
36
É ${Boost_INCLUDE_DIR}não ${BOOST_INCLUDE_DIR}, caso importa.
Ihor Kaharlichenko
3
Talvez isso tenha mudado nas versões mais recentes do cmake, mas aqui estão os documentos de referência: cmake.org/cmake/help/v3.0/module/FindBoost.html
Nick Desaulniers
2
não funciona para mim ... Encontra a biblioteca boost, mas gera toneladas de erros em tempo de compilação
1
Não deveria ser ' BOOST_INCLUDEDIR'?
dmedine de
2
@IhorKaharlichenko, mas BOOST_ROOT deve ser BOOST_ROOT. Maravilhoso ! Deixe-me tentar com todas as caixas, caixa de camelo, todas em maiúsculas, com sublinhados, sem sublinhados ... <face-palm>
Duck Dodgers
53

Há mais ajuda disponível lendo o FindBoost.cmakepró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_ROOTcorretamente.

FindBoost.cmaketambé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 lendo FindBoost.cmake.

Por último, FindBoost.cmaketeve alguns bugs no passado. Uma coisa que você pode tentar é pegar uma versão mais recente da FindBoost.cmakeúltima versão do CMake e colocá-la na pasta do projeto ao lado CMakeLists.txt- então, mesmo se você tiver uma versão antiga do boost, ele usará a nova versão FindBoost.cmakeque está em pasta do seu projeto.

Boa sorte.

vestido brilhante
fonte
10

Eu mesma lutei com esse problema por um tempo. Descobriu-se que cmakeestava 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 usando GCC 4.9.1, e essa versão do compilador estava de fato presente em nosso sistema; no entanto, GCC 4.4.7também foi instalado. Acontece que o FindBoost.cmakescript do cmake estava detectando automaticamente a GCC 4.4.7instalação em vez de GCC 4.9.1uma 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_COMPILERcomo " -gcc49" em CMakeLists.txt. Com esta mudança, FindBoost.cmakeprocurei e encontrei meus arquivos de biblioteca Boost.

Tom P.
fonte
6

Você também pode especificar a versão do Boost que gostaria que o CMake usasse, passando -DBOOST_INCLUDEDIRou -DBOOST_ROOTapontando para a localização dos cabeçalhos de boost da versão correta

Exemplo:

cmake -DBOOST_ROOT=/opt/latestboost

Isso também será útil quando várias versões de reforço estiverem no mesmo sistema.

Skillachie
fonte
Obrigado, isso funcionou para mim com o Avro build para Windows.
ggurov
5

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!

sphakka
fonte
Sim. Tive o mesmo problema por causa do caminho relativo no env BOOST_ROOT. Muito obrigado a você!
korst1k
2

Tive o mesmo problema ao tentar executar makeum 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 cmakeem busca de opções e encontrei o seguinte:

--check-system-vars        = Find problems with variable usage in system files

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.

user3006381
fonte
2

Para a versão cmake 3.1.0-rc2pegar, boost 1.57especifique-D_boost_TEST_VERSIONS=1.57

cmake version 3.1.0-rc2o padrão boost<=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++

Simon Allfrey
fonte
2

Se você está construindo seu próprio boost não se esqueça de usar o --layout=versionedcaso contrário a busca por uma versão particular da biblioteca irá falhar

Gaetano Mendola
fonte
1

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 que Boost_DEBUGproduz seu valor. A única coisa a fazer aqui é marcar a caixa de seleção "Avançado" e habilitá-la CGAL_Boost_USE_STATIC_LIBS.

Philip
fonte
0

Eu tive o mesmo problema e nenhuma das soluções acima funcionou. Na verdade, o arquivoinclude/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
PJ127
fonte
0

Isso também pode acontecer se CMAKE_FIND_ROOT_PATHfor definido como diferente de BOOST_ROOT. Enfrentei o mesmo problema que apesar de configurar BOOST_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_PATHparece estar substituindo o BOOST_ROOTque estava causando o problema.

Sabin
fonte
-1

Talvez

brew install boost

Ajudará você.

yayu
fonte