2013-04-11 85 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中的符号。希望这可以帮助!