2013-04-11 133 views
4

我試圖在Windows 8 我配置的CMakeLists.txt文件,安裝MLPack:鏈接到犰狳庫與CMake的

set(ARMADILLO_LIBRARY "C:\\Program Files (x86)\\armadillo\\lib") 
set(ARMADILLO_INCLUDE_DIR "C:\\Program Files (x86)\\armadillo\\include") 

然後,當我跑的CMake我有一整系列這樣的警告的:

WARNING: Target "mlpack" requests linking to directory "C:\Program Files (x86)\armadillo\lib". Targets may link only to libraries. CMake is dropping the item. 

在\ mlpack-1.0.4的\ src \ mlpack目錄中我發現了另一個CMakeLists與文件:

target_link_libraries(mlpack 
    ${ARMADILLO_LIBRARIES} 
    ${Boost_LIBRARIES} 
    ${LIBXML2_LIBRARIES} 
) 

我改變(不知道這是一個好主意):跑步讓我有一大堆這樣的錯誤的時候

-- Found Armadillo: C:\Program Files (x86)\armadillo\lib (found suitable version "3.800.2", minimum required is "2.4.2") 
-- Found LibXml2: C:\cpp\libraries\libxml2-2.7.8.win32\lib (found suitable version "2.7.8", minimum required is "2.6.0") 
-- Boost version: 1.53.0 
-- Found the following Boost libraries: 
-- program_options 
-- unit_test_framework 
-- Boost version: 1.53.0 
-- Found the following Boost libraries: 
-- random 
-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE) 
-- Configuring done 
-- Generating done 
-- Build files have been written to: C:/cpp/libraries/mlpack-1.0.4 

但現在:

target_link_libraries(mlpack 
    ${Boost_LIBRARIES} 
) 
link_directories(mlpack 
    ${ARMADILLO_LIBRARIES} 
    ${LIBXML2_LIBRARIES} 
) 

然後CMake的似乎可以流暢運行:

Linking CXX executable ..\..\..\..\gmm.exe 
CMakeFiles\gmm.dir/objects.a(gmm_main.cpp.obj):gmm_main.cpp:(.text+0xb9): undefined reference to `wrapper_dgemv_' 
CMakeFiles\gmm.dir/objects.a(gmm_main.cpp.obj):gmm_main.cpp:(.text$_ZN4arma6auxlib10det_lapackIdEET_RKNS_3MatIS2_EEb[__ZN4arma6auxlib10det_lapackIdEET_RKNS_3MatIS2_EEb]+0x115): undefined reference to `wrapper_dgetrf_' 

經過調查後似乎與犰狳有關。

任何想法發生了什麼?我想我應該使用armadillo的target_link_libraries,但我不知道如何。

+0

是的,您絕對需要在您自己的CMakeLists.txt中將target_link_libraries()鏈接到Armadillo。你可以張貼你的完整/相關部分CMakeLists.txt – 2013-04-11 03:43:49

+0

Thx很多。我想知道我是否可以真正發佈整個文件,這是相當長的。對於相關的部分,我剛剛找到一行「find_package(Armadillo 2.4.2 REQUIRED)」,後面跟着一行「include_directories($ {ARMADILLO_INCLUDE_DIRS})」。但我是真正的初學者,我可能會錯過某些東西。完整的文件在這裏:http://www.mlpack.org/files/mlpack-1.0.4.tar.gz我只是在文章中描述的變化... – Vince 2013-04-11 04:01:13

+0

添加如下內容:target_link_libraries(gmm.exe $ {} ARMADILLO_LIBRARIES)。看看這是否有效。或者只是使用「gmm」代替「gmm.exe」,然後再次嘗試 – 2013-04-11 06:53:33

回答

5

的問題是希望很容易解決。當你這樣做......

set(ARMADILLO_LIBRARY "C:\\Program Files (x86)\\armadillo\\lib") 
set(ARMADILLO_INCLUDE_DIR "C:\\Program Files (x86)\\armadillo\\include") 

你有效地短路find_package(Armadillo 2.4.2 REQUIRED)調用,因爲它預期將不得不做的工作,以找到這些路徑。然而,當find_package做的工作,變量ARMADILLO_LIBRARY被設置爲路徑庫本身 - 而不是路徑到lib目錄。

所以,問題歸結爲設置ARMADILLO_LIBRARY的路徑到lib目錄,而不是LIB本身。這最終產生由於目標gmm鏈接(在SRC \ mlpack \方法\ GMM \的CMakeLists.txt添加)到mlpack接頭錯誤,並且mlpack已經被設置爲鏈接到${ARMADILLO_LIBRARIES},這是不正確設置。

事實證明,find_package(Armadillo ...)已檢查在"$ENV{ProgramFiles}/Armadillo/lib""$ENV{ProgramFiles}/Armadillo/include",我希望你的機器上,這些決心"C:\\Program Files (x86)\\armadillo\\lib""C:\\Program Files (x86)\\armadillo\\include"

因此,要解決這個問題,您應該刪除線設置ARMADILLO_LIBRARYARMADILLO_INCLUDE_DIR,並恢復您在變化的src \ mlpack \的CMakeLists.txt(使用link_directories通常是一個壞主意,反正)。

在做出這些更改之後,應該在重新運行CMake之前至少刪除您的CMakeCache.txt(在構建樹的根目錄中)或甚至整個構建樹,以避免使用以前的錯誤緩存值失敗的嘗試。

+0

Thx!試過這個,但我得到這個錯誤:CMake錯誤在C:/ Program Files(x86)/ CMake 2.8/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97(message):找不到Armadillo:找到不合適的版本「0.0 .0「,但需要的是至少」2.4.2「(找到C:/ Program Files(x86)/armadillo/lib/libarmadillo.dll)...可能是因爲我的安裝犰狳是搞砸了嗎? – Vince 2013-04-12 00:24:04

+0

是的 - 可能。您是否使用MLPack的相同發生器來編譯Armadillo? (MinGW?)它看起來像Armadillo lib找到了正確的,但它不能被正確地讀取以找出它的版本。 – Fraser 2013-04-12 00:49:50

+0

我使用cmake編譯了犰狳,然後使用mingw32-make install。現在,我只是再次執行它,而沒有對cmake文件進行任何更改(除了刪除緩存和樹),事情進行得很順利(與我幾天前做的一樣)。現在我不確定上次我搞亂了什麼,因爲之後使用mlpack的cmake現在似乎滿足於armadillo(檢測版本3.800.2)。但是現在我有關於libxml2的警告(「目標可能只鏈接到庫」)。沒有編譯libxml2,只是下載的二進制文件...可能來自那個? (順便說一句,超thx的幫助) – Vince 2013-04-12 02:17:28

5

我意識到這是一個遲到的回答,我希望你有它想通了現在。即便如此,我相信你的問題是ARMADILLO_LIBRARY變量應該保存庫的確切位置,而不是庫所在的目錄。所以,也許這會工作:

set(ARMADILLO_LIBRARY "C:\\Program Files (x86)\\armadillo\\lib\\armadillo.lib") 
set(ARMADILLO_INCLUDE_DIR "C:\\Program Files (x86)\\armadillo\\include") 

變量LIBXML2_LIBRARIES還應該包含libxml2.lib的實際路徑(或任何實際的庫調用)。

你見過這個頁面的說明,我寫了一段時間來編譯Windows上的mlpack嗎?

http://www.mlpack.org/trac/wiki/MLPACKOnWindows

隨意,如果你有在未來進一步的問題提交的Trac系統的bug報告。我只偶然偶然發現了這個問題,所以我不會監視Stack Overflow的問題。

3

我遇到了同樣的問題。有兩發子彈aramadillo library faq這要求您取消註釋行

#define ARMA_USE_LAPACK 
#define ARMA_USE_WRAPPER 

文件

include/armadillo_bits/config.hpp 

這是在犰狳的源代碼樹英寸

在取消註釋行之後重新編譯時,可以看到armadillo共享庫/ dll中的符號。希望這可以幫助!