Cmake không tìm thấy Boost


87

Tôi đang cố gắng định cấu hình một dự án bằng CMake, nhưng không tìm thấy thư viện Boost mặc dù chúng nằm trong thư mục được chỉ định. Tôi đã xác định Boost_INCLUDE_DIR, Boost_LIBRARYDIRBOOST_ROOT, nhưng tôi vẫn nhận được một lỗi nói rằng CMake là không thể tìm thấy Boost. Điều gì có thể là lý do của lỗi như vậy?


Một số phiên bản của Boost sử dụng cờ Boost_INCLUDE_DIRvà những phiên bản khác sử dụng cờ Boost_INCLUDEDIR( không có gạch dưới ). Bạn có thể kiểm tra một trong những quyền cho trường hợp của bạn bằng cách đọc các FindBoost.cmaketập tin, dướipath-to-cmake/Modules/FindBoost.cmake
marcelosalloum

FYI, nếu bạn đang xây dựng với sự hỗ trợ thúc đẩy CMake bạn nên sử dụngfind_package(Boost CONFIG)
Dmitry Sazonov

Câu trả lời:


105

Bạn có chắc mình đang làm đúng cách? Ý tưởng là bộ CMake BOOST_INCLUDE_DIR, BOOST_LIBRARYDIRBOOST_ROOTtự động. Làm điều gì đó như thế này trong CMakeLists.txt:

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

Nếu boost không được cài đặt ở vị trí mặc định và CMake có thể không tìm thấy nó, bạn có thể cho CMake biết nơi để tìm kiếm boost như sau:

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

Tất nhiên, những người hai dòng phải trước sự FIND_PACKAGE(Boost)trong CMakeLists.txt.


36
${Boost_INCLUDE_DIR}không phải ${BOOST_INCLUDE_DIR}, vấn đề trường hợp.
Ihor Kaharlichenko

3
Có lẽ điều này đã thay đổi trong phiên bản mới của cmake, nhưng đây là tài liệu tham khảo: cmake.org/cmake/help/v3.0/module/FindBoost.html
Nick Desaulniers

2
nó không làm việc cho tôi ... Nó tìm thấy thư viện tăng, nhưng tạo ra tấn lỗi lúc biên soạn

1
Có nên không ' BOOST_INCLUDEDIR'?
nhật

2
@IhorKaharlichenko, nhưng BOOST_ROOT phải là BOOST_ROOT. Tuyệt vời ! Hãy để tôi thử với tất cả các trường hợp, trường hợp lạc đà, tất cả mũ, với dấu gạch dưới, không dấu gạch ... <mặt cọ>
Vịt Dodgers

53

Có thêm trợ giúp có sẵn bằng cách đọc FindBoost.cmakechính tệp. Nó nằm trong thư mục 'Mô-đun' của bạn.

Một khởi đầu tốt là set(Boost_DEBUG 1)- điều này sẽ cung cấp rất nhiều thông tin về nơi mà boost đang tìm kiếm, những gì nó đang tìm kiếm và có thể giúp giải thích tại sao nó không thể tìm thấy nó.

Nó cũng có thể giúp bạn tìm ra liệu nó có đang tiếp cận BOOST_ROOTđúng cách của bạn hay không.

FindBoost.cmakeđôi khi cũng gặp sự cố nếu phiên bản chính xác của boost không được liệt kê trong các biến Phiên bản có sẵn. Bạn có thể tìm thêm về điều này bằng cách đọc FindBoost.cmake.

Cuối cùng, FindBoost.cmakeđã có một số lỗi trong quá khứ. Một điều bạn có thể thử là để có một phiên bản mới hơn của FindBoost.cmakehiện của phiên bản mới nhất của CMake, và dính nó vào thư mục dự án của bạn bên cạnh CMakeLists.txt- sau đó ngay cả khi bạn có một phiên bản cũ của tăng, nó sẽ sử dụng phiên bản mới của FindBoost.cmakeđó là trong thư mục dự án của bạn.

Chúc may mắn.


10

Tôi đã đấu tranh với vấn đề này trong một thời gian chính mình. Hóa ra cmakelà tìm kiếm các tệp thư viện Boost bằng cách sử dụng quy ước đặt tên của Boost, trong đó tên thư viện là một chức năng của phiên bản trình biên dịch được sử dụng để xây dựng nó. Thư viện Boost của chúng tôi được xây dựng bằng cách sử dụng GCC 4.9.1và phiên bản trình biên dịch đó trên thực tế đã có mặt trên hệ thống của chúng tôi; tuy nhiên, GCC 4.4.7cũng tình cờ được cài đặt. Khi nó xảy ra, FindBoost.cmaketập lệnh của cmake đã tự động phát hiện GCC 4.4.7cài đặt thay vì cài đặt GCC 4.9.1và do đó đang tìm kiếm các tệp thư viện Boost có " gcc44" trong tên tệp, thay vì " gcc49".

Cách khắc phục đơn giản là buộc cmake giả định rằng GCC 4.9 có mặt, bằng cách đặt Boost_COMPILERthành " -gcc49" trong CMakeLists.txt. Với thay đổi này, FindBoost.cmakeđã tìm và tìm thấy các tệp thư viện Boost của tôi.


6

Bạn cũng có thể chỉ định phiên bản Boost mà bạn muốn CMake sử dụng bằng cách chuyển -DBOOST_INCLUDEDIRhoặc -DBOOST_ROOTtrỏ đến vị trí của các tiêu đề tăng phiên bản chính xác

Thí dụ:

cmake -DBOOST_ROOT=/opt/latestboost

Điều này cũng sẽ hữu ích khi có nhiều phiên bản tăng cường trên cùng một hệ thống.


Cảm ơn, điều đó đã hiệu quả với tôi với bản dựng Avro dành cho Windows.
ggurov

5

Tôi cũng gặp sự cố tương tự và phát hiện ra rằng các biến BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR và BOOST_ROOT env phải giữ đường dẫn tuyệt đối . HTH!


Đúng. Gặp sự cố tương tự do đường dẫn tương đối trong env BOOST_ROOT. Cảm ơn bạn nhiều!
korst1k

2

Tôi đã gặp vấn đề tương tự khi cố gắng chạy make một dự án sau khi cài đặt phiên bản Boost 1.66.0 trên Ubuntu Trusty64. Thông báo lỗi tương tự như (không chính xác như) sau:

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 chắc chắn đã được cài đặt, nhưng CMake không thể phát hiện ra nó. Sau khi dành nhiều thời gian tìm hiểu các đường dẫn và các biến môi trường, cuối cùng tôi đã kiểm tracmake tự các tùy chọn và tìm thấy những điều sau:

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

Vì vậy, tôi đã chạy phần sau trong thư mục được đề cập:

sudo cmake --check-system-vars

đã trả lại:

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

và giải quyết vấn đề.


2

Đối với phiên bản cmake 3.1.0-rc2để chọn boost 1.57chỉ định-D_boost_TEST_VERSIONS=1.57

cmake version 3.1.0-rc2mặc định boost<=1.56.0là như được thấy bằng cách sử dụng-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

Nếu bạn đang xây dựng bộ tăng cường của riêng mình, đừng quên sử dụng --layout=versionednếu không, việc tìm kiếm một phiên bản thư viện cụ thể sẽ không thành công


1

Thêm một lời khuyên cho bất kỳ ai đang cố gắng xây dựng CGAL nói riêng, với Boost được liên kết tĩnh. Nó không đủ để định nghĩa Boost_USE_STATIC_LIBS; nó sẽ bị ghi đè theo thời gian Boost_DEBUGxuất ra giá trị của nó. Việc cần làm ở đây là chọn hộp kiểm "Nâng cao" và bật CGAL_Boost_USE_STATIC_LIBS.


0

Tôi đã gặp vấn đề tương tự và không có giải pháp nào ở trên hoạt động. Trên thực tế, include/boost/version.hppkhông thể đọc tệp (bởi tập lệnh cmake do jenkins khởi chạy).

Tôi đã phải thay đổi thủ công quyền của thư viện (tăng cường) (mặc dù jenkins thuộc về nhóm, nhưng đó là một vấn đề khác liên quan đến jenkins mà tôi không thể tìm ra):

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

Điều này cũng có thể xảy ra nếu CMAKE_FIND_ROOT_PATHđược đặt là khác với BOOST_ROOT. Tôi phải đối mặt với cùng một vấn đề mà mặc dù đã thiết lập BOOST_ROOT, tôi vẫn gặp lỗi. Nhưng để biên dịch chéo cho ARM, tôi đã sử dụng Toolchain-android.cmake mà tôi có (vì một số lý do):

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_PATHdường như đang ghi đè BOOST_ROOTgây ra sự cố.


-1

Có lẽ

brew install boost

sẽ giúp bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.