답변:
이것을 CMakeLists.txt
파일에 넣으십시오 (원하는 경우 옵션을 OFF에서 ON으로 변경하십시오).
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.45.0 COMPONENTS *boost libraries here*)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(progname file1.cxx file2.cxx)
target_link_libraries(progname ${Boost_LIBRARIES})
endif()
분명히 내가 원하는 곳에 라이브러리를 넣어야 *boost libraries here*
합니다. 예를 들어 filesystem
및 regex
라이브러리를 사용하는 경우 다음 과 같이 작성합니다.
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
lexical_cast
. 따라서 find_package
및 include_directories
명령 만 필요합니다 .
*boost libraries here*
뜻이야?
FIND_PACKAGE(Boost REQUIRED COMPONENTS system)
부스트의 정확한 버전을 모르는 경우 에도 사용할 수 있습니다
find_package 를 사용하여 사용 가능한 부스트 라이브러리를 검색 할 수 있습니다. FindBoost.cmake에 대한 Boost 검색을 연기합니다. , 이는 기본적으로 CMake와 함께 설치됩니다.
Boost를 찾으면 find_package()
호출이 많은 변수를 채웠을 것 입니다 ( FindBoost.cmake에 대한 참조 확인 ). 이 중에는 BOOST_INCLUDE_DIRS
Boost_LIBRARIES 및 Boost_XXX_LIBRARY 변수가 있으며 XXX는 특정 Boost 라이브러리로 대체되었습니다. 이를 사용하여 include_directories 및 target_link_libraries 를 지정할 수 있습니다. .
예를 들어 boost :: program_options 및 boost :: regex가 필요하다고 가정하면 다음과 같이 할 수 있습니다.
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} )
몇 가지 일반적인 팁 :
On
: Boost_USE_STATIC_LIBS
, Boost_USE_MULTITHREADED
,Boost_USE_STATIC_RUNTIME
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
가져온 대상이있는 최신 CMake 구문에 대한 @LainIwakura의 답변을 적용하면 다음과 같습니다.
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
if(Boost_FOUND)
add_executable(progname file1.cxx file2.cxx)
target_link_libraries(progname Boost::filesystem Boost::regex)
endif()
이미 가져온 대상 Boost::filesystem
및 을 통해 처리되었으므로 포함 디렉터리를 수동으로 지정할 필요가 없습니다 Boost::regex
.
regex
그리고 filesystem
당신이 필요로하는 모든 부스트 라이브러리로 대체 될 수있다.
이것이 어떤 사람들에게 도움이 될 수 있기를 바랍니다. 장난 꾸러기 오류 : '_ZN5boost6system15system_categoryEv'기호에 대한 정의되지 않은 참조 //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0 : 기호 추가 오류 : DSO가 명령 줄에서 누락 됨 cmakeList.txt 문제가있었습니다. 그리고 어떻게 든 "시스템"과 "파일 시스템"라이브러리를 명시 적으로 포함하지 못했습니다. 그래서 저는 CMakeLists.txt에이 줄을 썼습니다.
이 줄은 프로젝트 실행 파일을 만들기 전에 처음에 작성됩니다.이 단계에서는 부스트 라이브러리를 프로젝트 실행 파일에 연결할 필요가 없습니다.
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
set(Boost_NO_SYSTEM_PATHS TRUE)
if (Boost_NO_SYSTEM_PATHS)
set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost")
set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include")
set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib")
endif (Boost_NO_SYSTEM_PATHS)
find_package(Boost COMPONENTS regex date_time system filesystem thread graph program_options)
find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options)
find_package(Boost COMPONENTS program_options REQUIRED)
이제 파일 끝에서 "KeyPointEvaluation"을 프로젝트 실행 파일로 간주하여이 줄을 작성했습니다.
if(Boost_FOUND)
include_directories(${BOOST_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
add_definitions(${Boost_DEFINITIONS})
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(KeyPointEvaluation ${Boost_LIBRARIES})
target_link_libraries( KeyPointEvaluation ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_REGEX_LIBRARY} ${Boost_SYSTEM_LIBRARY})
endif()
답변 1 과 2에 동의합니다 . 그러나 각 라이브러리를 개별적으로 지정하는 것을 선호합니다. 이것은 큰 프로젝트에서 종속성을 더 명확하게 만듭니다. 그러나 (대소 문자 구분) 변수 이름을 잘못 입력 할 위험이 있습니다. 이 경우 직접적인 cmake 오류는 없지만 나중에 정의되지 않은 일부 참조 링커 문제가 발생하여 해결하는 데 시간이 걸릴 수 있습니다. 따라서 다음 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)
위에서 언급 한 예의 경우 다음과 같습니다.
VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARY Boost_REGEX_LIBRARY)
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY} )
"BOOST_PROGRAM_OPTIONS_LIBRARY"를 작성했다면 cmake에 의해 트리거 된 오류가 있었고 링커에 의해 훨씬 나중에 트리거되지 않았을 것입니다.
Boost 문서 를 말해보세요 .
set(Boost_USE_STATIC_LIBS ON) # only find static libs
set(Boost_USE_DEBUG_LIBS OFF) # ignore debug libs and
set(Boost_USE_RELEASE_LIBS ON) # only find release libs
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.66.0 COMPONENTS date_time filesystem system ...)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(foo foo.cc)
target_link_libraries(foo ${Boost_LIBRARIES})
endif()
foo를 프로젝트 이름으로 바꾸고 구성 요소를 자신의 것으로 바꾸는 것을 잊지 마십시오!