Cmake가 Boost를 찾지 못함


87

CMake를 사용하여 프로젝트를 구성하려고하는데 지정된 폴더에 있어도 Boost 라이브러리를 찾지 못합니다. Boost_INCLUDE_DIR, Boost_LIBRARYDIR및 을 지정 BOOST_ROOT했지만 CMake가 Boost를 찾을 수 없다는 오류가 여전히 발생합니다. 그러한 오류의 원인은 무엇일까요?


일부 Boost 버전은 플래그 Boost_INCLUDE_DIR를 사용하고 다른 버전은 플래그 Boost_INCLUDEDIR( 밑줄없이 )를 사용합니다. 당신은 읽어 보시면, 경우에 대한 권리를 확인하실 수 있습니다 FindBoost.cmake아래의 파일을path-to-cmake/Modules/FindBoost.cmake
marcelosalloum

당신이 CMake 지원 향상을 구축하는 경우 참고로, 당신은 사용해야합니다find_package(Boost CONFIG)
드미트리 Sazonov는

답변:


105

올바른 방법으로하고 있습니까? 아이디어는 그 CMake 세트입니다 BOOST_INCLUDE_DIR, BOOST_LIBRARYDIRBOOST_ROOT자동. 다음과 같이하십시오 CMakeLists.txt.

FIND_PACKAGE(Boost)
IF (Boost_FOUND)
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
    ADD_DEFINITIONS( "-DHAS_BOOST" )
ENDIF()

boost가 기본 위치에 설치되어 있지 않아 CMake에서 찾을 수없는 경우 다음과 같이 CMake에 부스트를 찾을 위치를 알릴 수 있습니다.

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")

물론,이 두 라인은해야 전에FIND_PACKAGE(Boost) 에서 CMakeLists.txt.


36
그것은이 ${Boost_INCLUDE_DIR}없습니다 ${BOOST_INCLUDE_DIR}, 경우 문제.
Ihor Kaharlichenko 2011

3
어쩌면이 cmake의 최신 버전으로 변경하지만, 여기에 참조 문서입니다했습니다 cmake.org/cmake/help/v3.0/module/FindBoost.html
닉 Desaulniers

2
이 컴파일시 에러 톤 그것은 부스트 라이브러리를 발견 ... 나를 위해 일을 나던하지만, 생성

1
' BOOST_INCLUDEDIR' 이어야하지 않습니까?
dmedine

2
@IhorKaharlichenko,하지만 BOOST_ROOT는 BOOST_ROOT이어야합니다. 훌륭한 ! 나 밑줄없이 밑줄 모든 경우에, 낙타 경우, 모두 대문자로 해 봅시다 ... <얼굴을 손바닥>
다저스 오리

53

FindBoost.cmake파일 자체 를 읽으면 더 많은 도움말을 볼 수 있습니다. 'Modules'디렉토리에 있습니다.

좋은 시작은 다음과 set(Boost_DEBUG 1)같습니다. 이것은 boost가 찾고있는 위치, 찾고있는 항목에 대한 많은 정보를 뱉어 내고 왜 찾을 수 없는지 설명하는 데 도움이 될 수 있습니다.

그것은 또한 그것이 당신을 BOOST_ROOT적절하게 선택하고 있는지 알아내는 데 도움이 될 수 있습니다 .

FindBoost.cmake사용 가능한 버전 변수에 정확한 부스트 버전이 나열되지 않은 경우에도 때때로 문제가 발생합니다. 자세한 내용은을 읽으십시오 FindBoost.cmake.

마지막으로 FindBoost.cmake과거에 몇 가지 버그가있었습니다. 시도 할 수있는 한 가지 방법 FindBoost.cmake은 최신 버전의 CMake에서 최신 버전을 가져 와서 프로젝트 폴더에 붙여 넣는 것입니다. CMakeLists.txt그러면 이전 버전의 boost가 있더라도 해당 버전의 새 버전을 사용합니다 FindBoost.cmake. 프로젝트의 폴더.

행운을 빕니다.


10

나는 잠시 동안이 문제로 어려움을 겪었습니다. cmake라이브러리 이름이 빌드에 사용 된 컴파일러 버전의 함수 인 Boost의 명명 규칙을 사용하여 Boost 라이브러리 파일을 찾고 있는 것으로 밝혀졌습니다 . 우리의 Boost 라이브러리는을 사용하여 빌드 GCC 4.9.1되었으며 그 컴파일러 버전은 실제로 우리 시스템에 존재했습니다. 그러나 GCC 4.4.7우연히 설치되었습니다. 실제로 cmake의 FindBoost.cmake스크립트는 GCC 4.4.7설치가 아닌 설치를 자동 감지 GCC 4.9.1하므로 gcc44파일 이름에 " gcc49" 가 아닌 " " 가있는 Boost 라이브러리 파일을 찾고있었습니다 .

간단한 수정은 다음을 설정하여 cmake가 GCC 4.9가 있다고 가정하도록하는 것입니다. Boost_COMPILER 에서 " -gcc49" 하여 입니다 CMakeLists.txt. 이 변경으로 FindBoost.cmake내 Boost 라이브러리 파일을 찾고 찾았습니다.


6

-DBOOST_INCLUDEDIR또는 전달하여 CMake에서 사용할 Boost 버전을 지정할 수도 있습니다.-DBOOST_ROOT올바른 버전 부스트 헤더의 위치를 가리켜 있습니다.

예:

cmake -DBOOST_ROOT=/opt/latestboost

이는 여러 부스트 버전이 동일한 시스템에있을 때도 유용합니다.


감사합니다. Windows 용 Avro 빌드에서 저에게 효과적이었습니다.
ggurov

5

나는 또한 비슷한 문제가 있었고 BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR 및 BOOST_ROOT 환경 변수가 절대 경로 를 보유해야 함을 발견했습니다 . HTH!


예. BOOST_ROOT 환경의 상대 경로 때문에 동일한 문제가 발생했습니다. 감사합니다!
korst1k

2

makeUbuntu Trusty64에 Boost 버전 1.66.0을 설치 한 후 프로젝트 를 실행하려고 할 때 동일한 문제가 발생 했습니다. 오류 메시지는 다음과 유사합니다 (정확히 같지는 않음).

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)

Boost는 확실히 설치되었지만 CMake가 감지하지 못했습니다. 경로와 환경 변수를 수정하는 데 많은 시간을 보낸 후 결국 cmake옵션을 확인하고 다음을 발견했습니다.

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

그래서 문제가되는 디렉토리에서 다음을 실행했습니다.

sudo cmake --check-system-vars

반환 된 :

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

문제를 해결했습니다.


2

cmake 버전에 대한 3.1.0-rc2데리러 boost 1.57지정-D_boost_TEST_VERSIONS=1.57

cmake version 3.1.0-rc2기본값 boost<=1.56.0은 다음을 사용하여 표시됩니다.-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++


2

자신의 부스트를 구축하는 --layout=versioned경우 를 사용하는 것을 잊지 마십시오. 그렇지 않으면 특정 버전의 라이브러리 검색이 실패합니다


1

특히 정적으로 연결된 Boost 를 사용하여 CGAL 을 빌드하려는 모든 사람을위한 조언이 하나 더 있습니다. 정의하는 것만으로는 충분하지 않습니다 Boost_USE_STATIC_LIBS. 시간이 Boost_DEBUG그 값을 출력 함으로써 무시됩니다 . 여기서해야 할 일은 "고급"확인란을 선택하고을 활성화하는 것 CGAL_Boost_USE_STATIC_LIBS입니다.


0

나는 같은 문제가 있었고 위의 해결책 중 어느 것도 작동하지 않았습니다. 사실, 파일include/boost/version.hpp 읽을 수 없습니다 (젠킨스가 시작한 cmake 스크립트에 의해).

(부스트) 라이브러리 의 권한 을 수동으로 변경 해야 했습니다 (젠킨스가 그룹에 속하지만 그것은 내가 알아낼 수 없었던 젠킨스와 관련된 또 다른 문제입니다).

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

0

이와 CMAKE_FIND_ROOT_PATH다르게 설정된 경우에도 발생할 수 있습니다 BOOST_ROOT. 나는 설정에도 불구하고 BOOST_ROOT오류가 발생 하는 것과 동일한 문제에 직면했습니다 . 그러나 ARM 크로스 컴파일을 위해 (어떤 이유로 든) Toolchain-android.cmake를 사용했습니다.

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_PATHBOOST_ROOT문제의 원인을 재정의 하는 것 같습니다 .


-1

아마도

brew install boost

너를 도울 것이다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.