使用CMake链接到Armadillo库

时间:2013-04-11 02:42:28

标签: linker cmake armadillo mlpack

我正在尝试在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使用target_link_libraries,但我不确定如何。

3 个答案:

答案 0 :(得分: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 \ methods \ gmm \ CMakeLists.txt中添加)链接到mlpack,并且mlpack已设置为链接到{ {1}},未正确设置。

事实证明,${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_LIBRARY的行,并在src \ mlpack \ CMakeLists.txt中恢复您的更改(使用link_directories通常是一个坏主意反正)。

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

答案 1 :(得分: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的问题。

答案 2 :(得分:3)

我遇到了同样的问题。有两个子弹aramadillo library faq要求您取消注释行

#define ARMA_USE_LAPACK 
#define ARMA_USE_WRAPPER
文件中的

include/armadillo_bits/config.hpp

位于犰狳源树中。

在取消注释行后重新编译时,可以在armadillo共享库/ dll中看到符号。希望这有帮助!