2012-03-30 28 views
14

Tôi đang cố gắng để có CMake 2.8.6 liên kết để thúc đẩy :: program_options sử dụng đoạn mã sau vào CMakeLists.txt tôiCMake FIND_PACKAGE thành công nhưng trả về sai con đường

FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED) 
INCLUDE_DIRECTORIES (${Boost_INCLUDE_DIR}) 

ADD_EXECUTABLE (segment segment.cpp) 
TARGET_LINK_LIBRARIES (segment ${Boost_LIBRARIES}) 

Lệnh find dường như thành công nhưng đi thư mục sai cho trình liên kết. Các gói phần mềm là thực sự trong:

`/usr/lib64/libboost_program_options-mt.so.5` 

nhưng CMakeFiles/segment.dir/link.txt danh sách như sau:

/cm/shared/apps/gcc/4.4.6/bin/c++  CMakeFiles/segment.dir/segment.cpp.o -o segment -rdynamic /usr/lib64/lib64/libboost_program_options-mt.so.5 -lpthread -lrt -Wl,-rpath,/usr/lib64/lib64 

Lưu ý thêm các lib64 trong đường dẫn. Ngoài ra, cờ -l ở phía trước đường dẫn dường như bị thiếu.

Khi chạy CMake nó báo cáo rằng nó một cách chính xác tìm thấy gói, và biến {$Boost_LIBRARIES} dường như liệt kê các libs đúng:

Boost found. 
Found Boost components: 
    program_options 
${Boost_LIBRARIES} - optimized;boost_program_options-mt-shared;debug;boost_program_options-mt-shared-debug 

File CMakeCache.txt tạo bắt đầu với:

//The directory containing a CMake configuration file for Boost. 
Boost_DIR:PATH=/usr/lib64/boost 

//Boost include directory 
Boost_INCLUDE_DIR:FILEPATH=/usr/include 

Mà có vẻ là chính xác. Nhưng khi chạy làm cho nó sử dụng các đường dẫn trong link.txt ở trên và tôi nhận được lỗi:

make[2]: *** No rule to make target `/usr/lib64/lib64/libboost_program_options-mt.so.5', needed by `segment'. Stop. 
make[1]: *** [CMakeFiles/segment.dir/all] Error 2 
make: *** [all] Error 2 

Điều gì có thể gây ra thêm một tiểu phân này vào đường dẫn? Điều gì có thể gây ra link.txt được tạo theo cách này? Và làm thế nào để sửa chữa nó (hoặc làm việc xung quanh nó)?

+0

Bạn có thể thêm 'SET (Boost_DEBUG 1)' trước 'FIND_PACKAGE' và' MESSAGE ("\ $ {Boost_LIBRARIES} - $ {Boost_LIBRARIES}") 'sau' FIND_PACKAGE' trong tệp CMakeLists.txt của bạn không. Sau đó xóa CMakeCache.txt của bạn, chạy CMake và dán đầu ra dưới dạng bản chỉnh sửa cho câu hỏi của bạn. – Fraser

+0

@Fraser Dường như tìm đúng libs, đây là kết quả đầu ra (cũng được bao gồm ở trên): '$ {Boost_LIBRARIES} - được tối ưu hóa; boost_program_options-mt-shared; debug; boost_program_options-mt-shared-debug' – CvW

+0

Như một giải pháp thay thế, làm cách nào để đặt đường dẫn liên kết theo cách thủ công? – CvW

Trả lời

24

Vấn đề này xảy ra khi sử dụng một số phiên bản cũ của tăng với cmake-2.8.6-rc2 hay muộn, nơi mã phát hiện tăng gói đã được thay đổi.

Sự cố có thể được khắc phục bằng cách chỉ định -DBoost_NO_BOOST_CMAKE=ON trên dòng lệnh cmake.

Cam kết thực tế khi vấn đề này được giới thiệu là 7da796d1fdd7cca07df733d010cd343f6f8787a9 và có thể là viewed here.

4

Điều này có vẻ là vấn đề với CMake 2.8.6 trên CentOS. Khi thực hiện tương tự với 2.6.4 hoặc 2.8.3, nó hoạt động chính xác. Ngoài ra với 2.8.7 trên OS X nó cũng hoạt động chính xác.

3

Tôi cũng thấy vấn đề trên phiên bản cmake tiền biên dịch 2.8.8 sử dụng CentOS 64-bit 6.2

+0

Và sao lưu xuống 2.8.3 cũng cố định nó. – KyleL

+0

Tôi đã gửi một lỗi ở đây: http://public.kitware.com/Bug/view.php?id=13446 – KyleL

7

Vấn đề là với các tăng-devel tập tin phân phối:/usr/lib64/tăng/Tăng-relwithdebinfo .cmake

Gói cmake-2.6 không sử dụng tệp này, vì tệp FindBoost.cmake trả về (đúng) đường dẫn đầy đủ để tăng thư viện. Tệp cmake28-2.8.8 FindBoost.cmake trả về các chuỗi thư viện như "boost_date_time-mt-shared", là các đích được định nghĩa trong /usr/lib64/boost/Boost-relwithdebinfo.cmake.

Ở phía trên rất của /usr/lib64/boost/Boost-relwithdebinfo.cmake, một biến có tên _IMPORT_PREFIX được xác định từ vị trí của tập tin cmake chính nó, và sau đó sử dụng như sau:

#---------------------------------------------------------------- 
# Generated CMake target import file for configuration "RelWithDebInfo". 
#---------------------------------------------------------------- 

# Commands may need to know the format version. 
SET(CMAKE_IMPORT_FILE_VERSION 1) 

# Compute the installation prefix relative to this file. 
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) 
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) 

# Import target "boost_date_time-static" for configuration "RelWithDebInfo" 
SET_PROPERTY(TARGET boost_date_time-static APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO) 
SET_TARGET_PROPERTIES(boost_date_time-static PROPERTIES 
    IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib64/libboost_date_time.a" 
) 

Điều này đặt _IMPORT_PREFIX thành "/ usr/lib64", được nối với một chuỗi khác có/lib64/trong đó. Tôi thấy rằng nếu tôi chỉ đơn giản là thay đổi tập tin để bao gồm một cuộc gọi GET_FILENAME_COMPONENT thứ 3, nó hoạt động tốt. Cũng giống như vậy:

#---------------------------------------------------------------- 
# Generated CMake target import file for configuration "RelWithDebInfo". 
#---------------------------------------------------------------- 

# Commands may need to know the format version. 
SET(CMAKE_IMPORT_FILE_VERSION 1) 

# Compute the installation prefix relative to this file. 
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) 
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) 
GET_FILENAME_COMPONENT(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) 

# Import target "boost_date_time-static" for configuration "RelWithDebInfo" 
SET_PROPERTY(TARGET boost_date_time-static APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO) 
SET_TARGET_PROPERTIES(boost_date_time-static PROPERTIES 
    IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib64/libboost_date_time.a" 
) 
+0

Điều này tất cả về cmake là tốt hơn so với hầu hết các autohell? Tôi đã lãng phí hàng tuần kéo tóc của tôi ra cho đến khi tôi đã đọc này. – noobermin

0

tôi nhận thấy vấn đề này trên phiên bản cmake 2.8.11.2 với tăng-1.41.0-18.el6.x86_64

Câu trả lời đã được phê duyệt dường như không thỏa đáng bởi vì phụ thêm này xác định để thời gian chạy cmake tôi nhận được:

CMake Cảnh báo: biến cách thủ công theo quy định không được sử dụng bởi dự án:

Boost_NO_BOOST_CMAKE 

tôi dường như không thể bình luận hay downvote do không tham gia vào stackoverflow đủ. Đó là một vấn đề về thịt gà và trứng!

Tôi cũng không thể nêu lên lời giải thích của Kai Meyer. Tuy nhiên, tôi nghĩ điều này thực sự giải thích vấn đề.

Từ những gì tôi thu thập có vẻ như tóm lại, FindBoost.cmake do CMake cung cấp dường như đột nhiên không tìm thấy Boost, vì vậy mã tìm kiếm hiện đang tìm kiếm thông qua tập lệnh được cung cấp cho cmake, có lỗi và dường như không trả lại đường dẫn chính xác.

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