CMake를 사용하여 프로젝트를 구성하려고하는데 지정된 폴더에 있어도 Boost 라이브러리를 찾지 못합니다. Boost_INCLUDE_DIR
, Boost_LIBRARYDIR
및 을 지정 BOOST_ROOT
했지만 CMake가 Boost를 찾을 수 없다는 오류가 여전히 발생합니다. 그러한 오류의 원인은 무엇일까요?
find_package(Boost CONFIG)
CMake를 사용하여 프로젝트를 구성하려고하는데 지정된 폴더에 있어도 Boost 라이브러리를 찾지 못합니다. Boost_INCLUDE_DIR
, Boost_LIBRARYDIR
및 을 지정 BOOST_ROOT
했지만 CMake가 Boost를 찾을 수 없다는 오류가 여전히 발생합니다. 그러한 오류의 원인은 무엇일까요?
find_package(Boost CONFIG)
답변:
올바른 방법으로하고 있습니까? 아이디어는 그 CMake 세트입니다 BOOST_INCLUDE_DIR
, BOOST_LIBRARYDIR
및 BOOST_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
.
${Boost_INCLUDE_DIR}
없습니다 ${BOOST_INCLUDE_DIR}
, 경우 문제.
BOOST_INCLUDEDIR
' 이어야하지 않습니까?
FindBoost.cmake
파일 자체 를 읽으면 더 많은 도움말을 볼 수 있습니다. 'Modules'디렉토리에 있습니다.
좋은 시작은 다음과 set(Boost_DEBUG 1)
같습니다. 이것은 boost가 찾고있는 위치, 찾고있는 항목에 대한 많은 정보를 뱉어 내고 왜 찾을 수 없는지 설명하는 데 도움이 될 수 있습니다.
그것은 또한 그것이 당신을 BOOST_ROOT
적절하게 선택하고 있는지 알아내는 데 도움이 될 수 있습니다 .
FindBoost.cmake
사용 가능한 버전 변수에 정확한 부스트 버전이 나열되지 않은 경우에도 때때로 문제가 발생합니다. 자세한 내용은을 읽으십시오 FindBoost.cmake
.
마지막으로 FindBoost.cmake
과거에 몇 가지 버그가있었습니다. 시도 할 수있는 한 가지 방법 FindBoost.cmake
은 최신 버전의 CMake에서 최신 버전을 가져 와서 프로젝트 폴더에 붙여 넣는 것입니다. CMakeLists.txt
그러면 이전 버전의 boost가 있더라도 해당 버전의 새 버전을 사용합니다 FindBoost.cmake
. 프로젝트의 폴더.
행운을 빕니다.
나는 잠시 동안이 문제로 어려움을 겪었습니다. 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 라이브러리 파일을 찾고 찾았습니다.
-DBOOST_INCLUDEDIR
또는 전달하여 CMake에서 사용할 Boost 버전을 지정할 수도 있습니다.-DBOOST_ROOT
올바른 버전 부스트 헤더의 위치를 가리켜 있습니다.
예:
cmake -DBOOST_ROOT=/opt/latestboost
이는 여러 부스트 버전이 동일한 시스템에있을 때도 유용합니다.
make
Ubuntu 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
문제를 해결했습니다.
자신의 부스트를 구축하는 --layout=versioned
경우 를 사용하는 것을 잊지 마십시오. 그렇지 않으면 특정 버전의 라이브러리 검색이 실패합니다
나는 같은 문제가 있었고 위의 해결책 중 어느 것도 작동하지 않았습니다. 사실, 파일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
이와 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_PATH
BOOST_ROOT
문제의 원인을 재정의 하는 것 같습니다 .
Boost_INCLUDE_DIR
를 사용하고 다른 버전은 플래그Boost_INCLUDEDIR
( 밑줄없이 )를 사용합니다. 당신은 읽어 보시면, 경우에 대한 권리를 확인하실 수 있습니다FindBoost.cmake
아래의 파일을path-to-cmake/Modules/FindBoost.cmake