2011-11-10 40 views
14

Tôi đang cố gắng sử dụng một bộ thu thập cmake để biên dịch một ứng dụng dựa trên tăng trên cửa sổ. Các thư viện tiêu đề chỉ hoạt động tốt, nhưng cmakes thất bại trong việc tìm ra các thư viện (Các thư viện Boost sau không thể được tìm thấy: boost_serialization) Phần liên quan của kịch bản cmake là:cmake không tìm thấy thư viện tăng cường

#path where cmake can find additional libraries 
SET(CMAKE_PREFIX_PATH Libs) 

#boost 
SET(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
SET(Boost_USE_STATIC_LIBS ON) 
find_package(Boost REQUIRED COMPONENTS serialization) 

Tôi có một thư mục có tên " Libs "bên trong dự án của tôi, nơi các thư viện của bên thứ ba như DevIL và boost được lưu trữ, vì vậy tôi đã thiết lập điều này trước tiên. Hoạt động tốt cho Devil và tăng công cụ chỉ tiêu đề, vì vậy tôi giả sử tôi không cần biến BOOST_ROOT. Cài đặt tăng cường là phân phối nguồn chuẩn từ boost.org mà tôi đã biên dịch bằng bjam. Các thư viện được lưu trữ trong boost_1_47_0 \ bin.v2 \ libs, tôi không thay đổi gì trong quá trình xây dựng. Tôi nghĩ rằng nó hơi kỳ quặc, thư mục boost_1_47_0 \ libs không chứa bất kỳ tệp thư viện nào nhưng tệp bjam và các thứ khác, nhưng đó không phải là vấn đề vì đường nối này là cách bình thường để xây dựng tăng trên Windows từ nguồn.

Tôi đã xem kết quả gỡ lỗi từ FindBoost.cmake (Tôi đang sử dụng tập lệnh mặc định từ CMake 2.8) và nó không có đường may để xem trong bin.v2. Thay vào đó nó tìm kiếm boost_ROOT/lib, nhưng khi tôi sao chép nội dung từ bin.v2 \ libs sang lib nó vẫn không tìm thấy bất cứ điều gì.

Vì vậy, một cách thanh lịch để tìm kiếm tăng là gì, điều đó cũng sẽ hoạt động trên các plattforms khác với các bản phân phối bosst phổ biến?

Trả lời

5

Vâng, tôi đã giải quyết được vấn đề, nhưng tôi không hoàn toàn hài lòng với giải pháp của mình. Theo tôi, vấn đề là, bjam đó tạo ra một cấu trúc thư mục phức tạp. Bây giờ tôi chỉ cần sao chép các tập tin thư viện từ "boost_1_47_0 \ bin.v2 \ libs \ serialization \ build \ msvc-9,0 \ debug \ link-static \ luồng-đa" để "boost_1_47_0 \ lib". Tôi phải làm điều này bằng tay nhưng tôi không sử dụng nhiều thư viện tăng cường, vì vậy bước này là ok theo ý kiến ​​của tôi. Tôi sẽ ghi lại giải pháp của mình sang một bên tập lệnh cmake, vì vậy những người dùng khác nên làm quen với điều đó.

+5

Đọc hướng dẫn, tìm hiểu về giai đoạn và cài đặt. – mloskot

+0

Tôi đọc hướng dẫn sử dụng (http://www.boost.org/doc/libs/1_48_0/more/getting_started/windows.html) nhưng sử dụng tùy chọn 5.2. Tôi tìm thấy các thư mục giai đoạn với tất cả các thư viện trong nó và bây giờ có thể thiết lập này như thư viện tăng thư viện của tôi, nhưng thời gian tới tôi sẽ thử tùy chọn 5.3. – JonathanK

+0

Bạn cũng có thể chỉ cần sao chép giai đoạn và tăng (tiêu đề) thư mục xung quanh để thực hiện cài đặt Boost của riêng bạn. ví dụ. boost/-> C: \ boost \ include \ boost và stage/* -> C: \ boost \ lib – mloskot

13

Tôi sẽ thử đặt BOOST_ROOT bên trong CMakeLists.txt của bạn. Tôi biết rằng CMake 2.8.6 sẽ tìm thấy tăng 1.47.0 khi bạn đặt biến Boost_ADDITIONAL_VERSIONS vì nó hoạt động cho tôi trên các cửa sổ khi tôi có BOOST_ROOT được đặt.

Đây là những gì tôi có trong 1 dự án:

 

    set(BOOST_COMPONENTS_NEEDED serialization) 

    # The following verifyies that BOOST_ROOT is set properly. 
    if(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") 
     FILE(TO_CMAKE_PATH $ENV{BOOST_ROOT} BOOST_ROOT) 
     if(NOT EXISTS ${BOOST_ROOT}) 
      MESSAGE(STATUS ${BOOST_ROOT} " does not exist. Checking if BOOST_ROOT was a quoted string..") 
      STRING(REPLACE "\"" "" BOOST_ROOT ${BOOST_ROOT}) 
      if(EXISTS ${BOOST_ROOT}) 
       MESSAGE(STATUS "After removing the quotes " ${BOOST_ROOT} " was now found by CMake") 
      endif(EXISTS ${BOOST_ROOT}) 
     endif(NOT EXISTS ${BOOST_ROOT}) 

    # Save the BOOST_ROOT in the cache 
     if(NOT EXISTS ${BOOST_ROOT}) 
      MESSAGE(WARNING ${BOOST_ROOT} " does not exist.") 
     else(NOT EXISTS ${BOOST_ROOT}) 
      SET (BOOST_ROOT ${BOOST_ROOT} CACHE STRING "Set the value of BOOST_ROOT to point to the root folder of your boost install." FORCE) 
      #SET (BOOST_INCLUDEDIR ${BOOST_ROOT}/Include) 
      #SET (BOOST_LIBRARYDIR ${BOOST_ROOT}/lib) 
     endif(NOT EXISTS ${BOOST_ROOT}) 

    endif(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") 

    if(WIN32 AND NOT BOOST_ROOT) 
     MESSAGE(WARNING "Please set the BOOST_ROOT environment variable.") 
    endif(WIN32 AND NOT BOOST_ROOT) 

    set(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
    set(Boost_DEBUG ON) 
    set(Boost_USE_STATIC_LIBS  OFF) 
    set(Boost_USE_MULTITHREADED  ON) 
    set(Boost_USE_STATIC_RUNTIME OFF) 
    FIND_PACKAGE(Boost 1.47.0 COMPONENTS ${BOOST_COMPONENTS_NEEDED}) 
    if(Boost_FOUND) 
     MESSAGE(STATUS "Setting up boost.") 
     include_directories(${Boost_INCLUDE_DIRS}) 
     if(Boost_DEBUG) 
      MESSAGE(STATUS "BOOST Libraries " ${Boost_LIBRARIES}) 
      FOREACH(BOOST_COMPONENT ${BOOST_COMPONENTS_NEEDED}) 
       STRING(TOUPPER ${BOOST_COMPONENT} BOOST_COMPONENT_UPCASE) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} ": " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY}) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} " Debug: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_DEBUG}) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} " Release: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_RELEASE}) 
      ENDFOREACH(BOOST_COMPONENT) 
     endif(Boost_DEBUG) 
    endif(Boost_FOUND) 

+1

Điều này giúp tôi rất nhiều, cảm ơn kịch bản này. Tôi muốn đến một dòng ngay sau khi Boost_FOUND với điều này: LINK_DIRECTORIES ($ {Boost_LIBRARY_DIRS}) nếu không nó vẫn nói rằng thư viện đã không được tìm thấy. Hy vọng điều này sẽ giúp những người khác có cùng một vấn đề. – Cross

+0

- KHÔNG thể tìm thấy phiên bản Boost Boost: 1.60.0 Tăng đường dẫn bao gồm:/usr/include Phiên bản Boost đã phát hiện quá cũ. Phiên bản được yêu cầu là 1.64 (hoặc mới hơn). ..... Ngay cả khi thêm những gì được đề cập trong các bình luận ở trên (Windows 10/CLion) –

1

Tôi đã có một vấn đề với điều này trước đó. Đối với một số lý do b2 (aka bjam) tạo ra các thư viện tăng với một "lib" hàng đầu. Tập lệnh cmake sẽ không tìm kiếm tệp có tên libboost_thread.lib Nó sẽ chỉ tìm thấy boost_thread.lib. Loại bỏ các lib và cmake hàng đầu nên tìm thấy chúng.

+0

Tôi đã thử nhưng nó không giúp Bây giờ tên là một cái gì đó như boost_serialization-vc90-mt-1_47.lib thay vì libboost_serialization -vc90-mt-1_47.lib - và nếu tôi muốn sử dụng một số thư viện khác, tôi thực sự không muốn đổi tên tất cả để cmake có thể tìm thấy chúng. Theo tôi, find_package nên làm tất cả công việc cho tôi ... – JonathanK

+3

Không đổi tên libs. Tiền tố "lib" là cho các lib tĩnh, không có tiền tố là cho các DLL. Bạn nên xây dựng với runtime-link = shared. –

+0

@AndreasHaferburg Trong trường hợp của tôi, tôi đã cố gắng tăng liên kết tĩnh vào ứng dụng của mình. –

0

Bạn có thể thêm Option sau vào dòng lệnh của cmake nói CGAL sử dụng các thư viện tăng tĩnh:

-DCGAL_Boost_USE_STATIC_LIBS=true 
0

Đến đây với một vấn đề tương tự và chỉ muốn nói sửa chữa của tôi cũng tương tự nhưng không giống hệt nhau. Tiền tố cài đặt của tôi là C: \ lib \ boost \ boost_1_57_0. Tôi thiết lập một biến môi trường BOOST_ROOT trỏ đến thư mục đó nhưng CMake (3.1.0) vẫn không thể tìm thấy các tiêu đề. Tôi nhận ra các tiêu đề mặc định để cài đặt vào C: \ lib \ boost \ boost_1_57_0 \ include \ boost-1_57 \ boost. Tôi sẽ không chạy nhiều phiên bản vì vậy tôi chỉ chuyển thư mục tăng cuối cùng xuống và xóa thư mục boost-1_57 và kết thúc bằng tiêu đề tại đây:

C:\lib\boost\boost_1_57_0\include\boost 

Và CMake tìm thấy mọi thứ.

Các vấn đề liên quan