我正在尝试在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_'

经调查似乎与 Armadillo 有关。

知道发生了什么吗?我想我应该对Armadillo使用target_link_libraries,但是我不确定如何使用。

最佳答案

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

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设置为库目录的路径,而不是库本身。由于目标gmm(添加到src\mlpack\methods\gmm\CMakeLists.txt中)链接到mlpack,并且最终mlpack已设置为链接到正确设置的${ARMADILLO_LIBRARIES},因此最终会产生链接器错误。

事实证明find_package(Armadillo ...)已经 checkin 了"$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 通常是一个坏主意)。

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

10-07 21:46