Tôi cần thêm thư viện tăng vào CMakeLists.txt của mình. Làm thế nào để bạn làm điều đó hoặc làm thế nào để thêm nó?Làm cách nào để bạn thêm các thư viện tăng cường trong CMakeLists.txt
Trả lời
Đặt này trong tập tin CMakeLists.txt
của bạn (thay đổi bất kỳ tùy chọn từ OFF sang ON 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 bạn cần phải đặ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 muốn viết:
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
Lưu ý rằng bạn không cần phải chỉ định các thành phần cho các thư viện chỉ tiêu đề, chẳng hạn như 'lexical_cast'. Vì vậy, bạn chỉ cần lệnh 'find_package' và' include_directories'. –
Trên Windows, nó cũng có thể giúp thêm tệp này vào tệp cmake của bạn: ADD_DEFINITIONS (-DBOOST_ALL_NO_LIB) nếu không bạn có thể chạy vào http://stackoverflow.com/questions/28887680/linking-boost-library-with-boost-use- static-lib-off-on-windows –
là có thể thiết lập BOOST_USE_STATIC_LIBS thành ON và Boost_USE_STATIC_RUNTIME OFF? & ngược lại. – squid
Bạn có thể sử dụng find_package để tìm kiếm các thư viện tăng sẵn. Nó bảo vệ tìm kiếm Boost đến FindBoost.cmake, được cài đặt mặc định với CMake.
Khi tìm Boost, cuộc gọi find_package()
sẽ có nhiều biến (kiểm tra tham chiếu cho FindBoost.cmake). Trong số này có các biến số BOOST_INCLUDE_DIRS
, 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 các thông số này để chỉ định include_directories và target_link_libraries.
Ví dụ, giả sử bạn sẽ cần phải tăng :: program_options và đẩy mạnh :: regex, bạn sẽ làm điều gì đó như:
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ố lời khuyên chung:
- Khi tìm kiếm, FindBoost kiểm tra biến môi trường $ ENV {BOOST_ROOT}. Bạn có thể đặt biến này trước khi gọi find_package nếu cần.
- Khi bạn có nhiều phiên bản nâng cấp (đa luồng, tĩnh, chia sẻ, v.v.), bạn có thể chỉ định cấu hình bạn muốn trước khi gọi hàm find_package. Thực hiện việc này bằng cách đặt một số biến sau đây thành
On
:Boost_USE_STATIC_LIBS
,Boost_USE_MULTITHREADED
,Boost_USE_STATIC_RUNTIME
- Khi tìm kiếm Tăng trên Windows, hãy cẩn thận với liên kết tự động. Đọc "LƯU Ý cho Người dùng Visual Studio" trong reference.
- Lời khuyên của tôi là để vô hiệu hóa tính năng tự động liên kết và xử lý phụ thuộc sử dụng cmake của:
add_definitions(-DBOOST_ALL_NO_LIB)
- Trong một số trường hợp, bạn có thể cần phải xác định một cách rõ ràng rằng một Boost động được sử dụng:
add_definitions(-DBOOST_ALL_DYN_LINK)
- Lời khuyên của tôi là để vô hiệu hóa tính năng tự động liên kết và xử lý phụ thuộc sử dụng cmake của:
Cảm ơn bạn đã biết các mẹo chung. Họ đã giúp tôi rất nhiều. –
Câu trả lời vô cùng hữu ích! Có thể đã cứu tôi rất nhiều thời gian tôi đã tìm thấy điều này hai năm trước đây. Tuyệt vời viết lên. – Ela782
Tôi đồng ý với câu trả lời 1 và 2. Tuy nhiên, tôi muốn chỉ định riêng từng thư viện. Điều này làm cho các depencencies 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 đề liên kết tham chiếu không xác định sau này, có thể mất chút thời gian để giải quyết.Vì vậy, tôi sử dụng chức năng 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ụ nêu trên, điều này có vẻ 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 kích hoạt bởi cmake và không sau đó được kích hoạt bởi trình liên kết.
Thích ứng @ câu trả lời LainIwakura cho cú pháp CMake hiện đại với mục tiêu nhập khẩu, điều nà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 nó không phải là cần thiết nữa để xác định thư mục bao gồm bằng tay, vì nó đã được thực hiện 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 nào bạn cần.
Làm thế nào điều này sẽ nhìn nếu bạn muốn nói để liên kết với tất cả các tăng? Tôi có nghĩa là không có danh sách tất cả các thư viện có trong tăng. –
Nếu bạn chỉ sử dụng các phần chỉ hỗ trợ tiêu đề, 'Boost :: boost' sẽ là đủ. Tất cả các thư viện tăng biên dịch phải được xác định rõ ràng. – oLen
Có thể điều này có thể hữu ích đối với một số người. Tôi đã có một lỗi nghịch ngợm: tài liệu tham khảo không xác định đến biểu tượng //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0 '_ZN5boost6system15system_categoryEv': Lỗi ký thêm: DSO mất tích từ dòng lệnh Đã có một số vấn đề của cmakeList.txt và bằng cách nào đó tôi đã mất tích để bao gồm một cách rõ ràng các thư viện "hệ thống" và "hệ thống tập tin". 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 ngay từ đầu trước khi tạo thực thi dự án, vì ở giai đoạn này, chúng tôi không cần liên kết thư viện tăng cường với dự án thực thi của chúng tôi.
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ờ ở phần cuối của tệp, tôi đã viết những dòng này bằng cách xem xét "KeyPointEvaluation" làm 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()
- 1. Nhiều thư viện CMakeLists.txt
- 2. Có Thư viện tăng cường gui không?
- 3. Tăng cường giống như các thư viện trong C
- 4. Làm cách nào để sử dụng thư viện Tăng cường trong một dự án qmake?
- 5. Thư viện tăng cường nào chỉ là tiêu đề?
- 6. Tăng cường chấp nhận thư viện trong ngành
- 7. Lắng nghe phát sóng udp với thư viện tăng cường
- 8. Làm cách nào để nhận các biến môi trường hệ thống bằng cách sử dụng thư viện tăng cường?
- 9. cmake không tìm thấy thư viện tăng cường
- 10. Thư viện cho cây tăng cường độ dốc
- 11. Thư viện tăng cường, làm thế nào để có được yếu tố quyết định từ lu_factorize()?
- 12. Bao gồm các thư viện tăng cường để tạo các tệp
- 13. Làm cách nào để lấy một phần tử ra khỏi thư viện tăng cường (ví dụ: shared_pointer)?
- 14. Làm cách nào để thêm một thư viện trong Eclipse?
- 15. Liên kết thư viện tăng
- 16. Làm cách nào để chỉ xây dựng các mô-đun bắt buộc tăng cường?
- 17. Tăng cường các thư viện đồ thị: thiết lập các giá trị trọng số cạnh
- 18. Thư viện Tăng cường nào lợi dụng Di chuyển ngữ nghĩa
- 19. Làm thế nào để xây dựng tăng cường libs tĩnh?
- 20. Làm cách nào để xây dựng các ví dụ tăng cường với bjam?
- 21. làm thế nào để bạn kiểm tra phiên bản của bạn tăng?
- 22. Sử dụng tăng cường :: shared_ptr trong giao diện công cộng của thư viện
- 23. Tăng cài đặt thư viện cho Codeblocks
- 24. Tắt các cảnh báo do tăng thư viện
- 25. Làm thế nào để bạn vượt qua kwargs để tăng cường chức năng bọc python?
- 26. Làm cách nào để tải thêm thư viện cho GDB?
- 27. Làm cách nào để bạn đặt thứ tự các thư viện trong tự động?
- 28. Cách tắt tăng cường EBean
- 29. Hộp giới hạn cho tính toán Voronoi Diagram trong thư viện tăng cường
- 30. Làm thế nào để tăng cường :: make_shared một người bạn của lớp học của tôi
dòng này rosbuild_add_boost_directories() làm gì? – laksh