Câu trả lời:
Đặt cái này vào CMakeLists.txt
tệp của bạn (thay đổi bất kỳ tùy chọn nào từ TẮT sang BẬT nếu bạn muốn):
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()
Rõ ràng là bạn cần đặt các thư viện bạn muốn ở nơi tôi đặt *boost libraries here*
. Ví dụ: nếu bạn đang sử dụng thư viện filesystem
và regex
bạn sẽ viết:
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
lexical_cast
. Vì vậy, bạn chỉ cần lệnh find_package
và include_directories
.
*boost libraries here*
là gì?
FIND_PACKAGE(Boost REQUIRED COMPONENTS system)
nếu bạn không biết chính xác phiên bản của động lực để sử dụng
Bạn có thể sử dụng find_package để tìm kiếm các thư viện tăng cường có sẵn. Nó ngăn chặn tìm kiếm Boost thành FindBoost.cmake , được cài đặt mặc định với CMake.
Khi tìm thấy Boost, lệnh find_package()
gọi sẽ chứa nhiều biến (kiểm tra tham chiếu cho FindBoost.cmake ). Trong số này BOOST_INCLUDE_DIRS
, các biến thể Boost_LIBRARIES và Boost_XXX_LIBRARY, với XXX được thay thế bằng các thư viện Boost cụ thể. Bạn có thể sử dụng chúng để chỉ định thư mục include và target_link_libraries .
Ví dụ: giả sử bạn cần boost :: program_options và boost :: regex, bạn sẽ làm như sau:
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} )
Một số mẹo chung:
On
: Boost_USE_STATIC_LIBS
, Boost_USE_MULTITHREADED
,Boost_USE_STATIC_RUNTIME
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
Điều chỉnh câu trả lời của @ LainIwakura cho cú pháp CMake hiện đại với các mục tiêu đã nhập, đây sẽ là:
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()
Lưu ý rằng không cần thiết phải chỉ định các thư mục bao gồm theo cách thủ công nữa, vì nó đã được xử lý thông qua các mục tiêu được nhập Boost::filesystem
và Boost::regex
.
regex
và filesystem
có thể được thay thế bằng bất kỳ thư viện tăng cường nào bạn cần.
Có thể điều này có thể hữu ích cho một số người. Tôi đã gặp lỗi nghịch ngợm: tham chiếu không xác định tới biểu tượng '_ZN5boost6system15system_categoryEv' //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0: lỗi thêm ký hiệu: Thiếu DSO trong dòng lệnh Có một số vấn đề về cmakeList.txt và bằng cách nào đó tôi đã thiếu để đưa vào thư viện "hệ thống" và "hệ thống tệp" một cách rõ ràng. Vì vậy, tôi đã viết những dòng này trong CMakeLists.txt
Những dòng này được viết ở phần đầu trước khi tạo tệp thực thi của dự án, vì ở giai đoạn này, chúng ta không cần liên kết thư viện tăng cường với tệp thực thi dự án của chúng ta.
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)
Bây giờ ở cuối tệp, tôi đã viết những dòng này bằng cách coi "KeyPointEvaluation" là dự án thực thi của tôi.
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()
Tôi đồng ý với câu trả lời 1 và 2 . Tuy nhiên, tôi muốn chỉ định từng thư viện riêng biệt. Điều này làm cho sự thiếu hụt rõ ràng hơn trong các dự án lớn. Tuy nhiên, có nguy cơ gõ nhầm tên biến (phân biệt chữ hoa chữ thường). Trong trường hợp đó, không có lỗi cmake trực tiếp nhưng một số vấn đề về trình liên kết tham chiếu không xác định sau này, có thể mất một thời gian để giải quyết. Do đó tôi sử dụng hàm cmake sau:
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)
Đối với ví dụ được đề cập ở trên, điều này trông giống như:
VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARY Boost_REGEX_LIBRARY)
target_link_libraries( run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY} )
Nếu tôi đã viết "BOOST_PROGRAM_OPTIONS_LIBRARY" thì sẽ có một lỗi do cmake kích hoạt và không lâu sau đó do trình liên kết kích hoạt.
Hãy thử như nói tài liệu 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()
Đừng quên thay thế foo thành tên dự án của bạn và các thành phần của bạn!