6

我正在尝试在 Windows 8 上安装 MLPack。我将 CMakeLists.txt 文件配置为:

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}
)

我改为(不确定这是否是个好主意):

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

然后 CMake 似乎运行顺利:

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

但是现在运行 make 我有很多这样的错误:

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_'

经过调查,这似乎与犰狳有关。

知道发生了什么吗?我想我应该为犰狳使用 target_link_libraries 但我不确定如何。

4

3 回答 3

6

希望这个问题很容易解决。当你这样做...

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被设置为库本身的路径——而不是库目录的路径。

所以问题归结为设置ARMADILLO_LIBRARY到lib目录的路径而不是lib本身。这最终会产生链接器错误,因为目标gmm(在 src\mlpack\methods\gmm\CMakeLists.txt 中添加)链接到mlpack,并且mlpack已设置为链接到${ARMADILLO_LIBRARIES},但未正确设置。

事实证明,find_package(Armadillo ...)已经签入"$ENV{ProgramFiles}/Armadillo/lib"and "$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无论如何,使用通常是个坏主意)。

进行这些更改后,您应该至少删除您的 CMakeCache.txt(在构建树的根目录中),甚至在重新运行 CMake 之前删除整个构建树,以避免使用先前失败尝试中的错误缓存值的可能性。

于 2013-04-11T23:25:33.930 回答
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 上提交错误报告。我只是偶然发现了这一点,所以我没有监控 Stack Overflow 的问题。

于 2013-05-13T21:25:11.630 回答
3

我遇到了同样的问题。有两个子弹aramadillo 图书馆常见问题解答要求您取消注释行

#define ARMA_USE_LAPACK 
#define ARMA_USE_WRAPPER

在文件中

include/armadillo_bits/config.hpp

它在犰狳源代码树中。

取消注释后重新编译时,您可以看到犰狳共享库/dll 中的符号。希望这可以帮助!

于 2013-07-31T20:41:16.933 回答