2012-03-30 171 views
14

我想擁有的CMake 2.8.6的鏈接,以提高::使用下面的代碼program_options在我的CMakeLists.txtCMake的FIND_PACKAGE成功,但返回錯誤的路徑

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

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

find命令似乎成功,但經過鏈接器的目錄錯誤。封裝實際上是:以下

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

CMakeFiles/segment.dir/link.txt名單:

/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 

注意路徑額外lib64。另外,路徑前面的-l標誌似乎缺失。

當運行CMake的它報告說,它正確地發現包和{$Boost_LIBRARIES}變量似乎列出正確的庫:

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

生成CMakeCache.txt文件開頭:

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

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

這似乎是正確的。但運行make時它使用link.txt上面的路徑和我得到的錯誤:

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 

什麼可能導致子目錄的這種額外注入路徑?什麼可能導致以這種方式生成link.txt?我該如何解決它(或解決它)?

+0

你可以在你的CMakeLists.txt中的FIND_PACKAGE後添加'SET(Boost_DEBUG 1)'在'FIND_PACKAGE'和'MESSAGE(「\ $ {Boost_LIBRARIES} - $ {Boost_LIBRARIES}」)'之前''。然後刪除您的CMakeCache.txt,運行CMake並將輸出作爲編輯粘貼到您的問題中。 – Fraser 2012-03-31 16:10:50

+0

@Fraser它似乎找到正確的庫,這裏是輸出(也包括上面):'$ {Boost_LIBRARIES} - 優化; boost_program_options -mt-shared;調試; boost_program_options-mt-shared-debug' – CvW 2012-04-03 08:03:37

+0

作爲一種解決方法,如何手動設置鏈接路徑? – CvW 2012-04-03 09:23:37

回答

24

使用帶有cmake-2.8.6-rc2或更高版本,在增壓包發現代碼被改變了一些舊版本的提升時,就會出現此問題。

該問題可以通過在cmake命令行上指定-DBoost_NO_BOOST_CMAKE=ON解決。

引入此問題的實際提交是7da796d1fdd7cca07df733d010cd343f6f8787a9,並且可以是viewed here

4

這似乎是CentOS上CMake 2.8.6的一個問題。在對2.6.4或2.8.3進行相同操作時,它可以正常工作。 OS X上的2.8.7也可以正常工作。

3

我也看到了有關使用CentOS的預編譯cmake的版本2.8.8的64位6.2

+0

而後退到2.8.3也修正了它。 – KyleL 2012-07-31 15:18:47

+0

我在這裏提交了一個bug:http://public.kitware.com/Bug/view.php?id=13446 – KyleL 2012-07-31 15:26:43

7

問題是與升壓devel的分佈式文件的問題:在/ usr/lib64下/升壓/升壓 - relwithdebinfo .cmake

cmake-2.6程序包完全不使用此文件,因爲FindBoost.cmake文件返回(正確)完整路徑來增強庫。 cmake28-2.8.8 FindBoost.cmake文件返回類似「boost_date_time-mt-shared」的庫字符串,它們是/usr/lib64/boost/Boost-relwithdebinfo.cmake中定義的目標。

在/usr/lib64/boost/Boost-relwithdebinfo.cmake的最頂端,一個名爲_IMPORT_PREFIX變量是從cmake的文件本身的位置界定,然後使用像這樣:

#---------------------------------------------------------------- 
# 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" 
) 

這將_IMPORT_PREFIX設置爲「/ usr/lib64」,它與另一個/ lib64 /中的字符串連接。我發現如果我簡單地改變文件來包含第三個GET_FILENAME_COMPONENT調用,它就可以正常工作。像這樣:

#---------------------------------------------------------------- 
# 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

關於cmake比大多數autohell更好的是什麼?我已經浪費了數週時間,直到我讀完這篇文章。 – noobermin 2016-04-30 23:00:49

0

我注意到CMake的版本2.8.11.2就此問題與升壓1.41.0-18.el6.x86_64批准的答案似乎

並不令人滿意,因爲這個附加定義與cmake的運行時,我得到:

CMake的警告: 手動指定的變量不使用項目:

Boost_NO_BOOST_CMAKE 

我似乎無法發表評論或downvote由於不參與計算器不夠。這是一個雞雞蛋問題!

我似乎也看不出Kai Meyer的解釋。不過,我認爲這真的解釋了這個問題。

從我收集的數據看來,總而言之,CMake提供的FindBoost.cmake似乎突然未能找到Boost,因此查找代碼現在通過cmake的boost提供的腳本進行搜索,有一個錯誤,似乎沒有返回正確的路徑。

相關問題