首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CMake链接到Armadillo库

使用CMake链接到Armadillo库
EN

Stack Overflow用户
提问于 2013-04-11 10:42:28
回答 3查看 14.5K关注 0票数 6

我正在尝试在windows 8上安装MLPack。我使用以下命令配置CMakeLists.txt文件:

代码语言:javascript
复制
set(ARMADILLO_LIBRARY "C:\\Program Files (x86)\\armadillo\\lib")
set(ARMADILLO_INCLUDE_DIR "C:\\Program Files (x86)\\armadillo\\include")

然后,当我运行CMake时,我收到了一系列警告,如下所示:

代码语言:javascript
复制
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文件,其中包含:

代码语言:javascript
复制
target_link_libraries(mlpack
  ${ARMADILLO_LIBRARIES}
  ${Boost_LIBRARIES}
  ${LIBXML2_LIBRARIES}
)

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

代码语言:javascript
复制
target_link_libraries(mlpack
  ${Boost_LIBRARIES}
)
link_directories(mlpack
  ${ARMADILLO_LIBRARIES}
  ${LIBXML2_LIBRARIES}
)

然后,CMake似乎运行得很流畅:

代码语言:javascript
复制
-- 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时,我会遇到很多这样的错误:

代码语言:javascript
复制
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,但我不确定如何使用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-12 07:25:34

希望这个问题很容易解决。当你这么做的时候。

代码语言:javascript
复制
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设置为库目录的路径,而不是库本身。这最终会产生一个链接器错误,因为目标gmm (在src\mlpack\methods\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 (在构建树的根目录中),甚至删除整个构建树,以避免以前失败的尝试使用错误的缓存值的可能性。

票数 6
EN

Stack Overflow用户

发布于 2013-05-14 05:25:12

我意识到这是一个迟来的回答,我希望你现在已经弄清楚了。即便如此,我认为您的问题是ARMADILLO_LIBRARY变量应该保存库的确切位置,而不是库所在的目录。所以,这可能会起作用:

代码语言:javascript
复制
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中的问题。

票数 5
EN

Stack Overflow用户

发布于 2013-08-01 04:41:17

我遇到了同样的问题。有两个项目符号aramadillo library faq要求您取消对这些行的注释

代码语言:javascript
复制
#define ARMA_USE_LAPACK 
#define ARMA_USE_WRAPPER

在文件中

代码语言:javascript
复制
include/armadillo_bits/config.hpp

它就在蝗虫的资源树里。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15939824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档