Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linker 使用CMake链接到犰狳库_Linker_Cmake_Armadillo_Mlpack - Fatal编程技术网

Linker 使用CMake链接到犰狳库

Linker 使用CMake链接到犰狳库,linker,cmake,armadillo,mlpack,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") target_link_libraries(mlpack ${ARMADILLO_LIBRARIES} ${Bo

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

set(ARMADILLO_LIBRARY "C:\\Program Files (x86)\\armadillo\\lib")
set(ARMADILLO_INCLUDE_DIR "C:\\Program Files (x86)\\armadillo\\include")
target_link_libraries(mlpack
  ${ARMADILLO_LIBRARIES}
  ${Boost_LIBRARIES}
  ${LIBXML2_LIBRARIES}
)
然后,当我运行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目录中,我找到了另一个CmakeList文件,其中包含:

set(ARMADILLO_LIBRARY "C:\\Program Files (x86)\\armadillo\\lib")
set(ARMADILLO_INCLUDE_DIR "C:\\Program Files (x86)\\armadillo\\include")
target_link_libraries(mlpack
  ${ARMADILLO_LIBRARIES}
  ${Boost_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_库,但我不确定如何使用。

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

set(ARMADILLO_LIBRARY "C:\\Program Files (x86)\\armadillo\\lib")
set(ARMADILLO_INCLUDE_DIR "C:\\Program Files (x86)\\armadillo\\include")
您实际上是在短路
find_包(Armadillo 2.4.2必选)
调用,因为它需要完成查找这些路径的工作。但是,当
find_package
执行此操作时,变量
ARMADILLO_LIBRARY
将设置为库本身的路径,而不是库目录的路径

因此,问题归结为将
ARMADILLO_LIBRARY
设置为lib目录的路径,而不是lib本身。这最终会产生链接器错误,因为目标
gmm
(添加在src\mlpack\methods\gmm\CMakeLists.txt中)链接到
mlpack
,并且
mlpack
已设置为链接到
${ARMADILLO\u 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
ARMADILLO_INCLUDE_DIR
,并在src\mlpack\CMakeLists.txt中恢复您的更改(无论如何,使用通常是个坏主意)


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

我意识到这是一个迟来的答案,希望您现在已经找到答案。即使如此,我相信您的问题是ARMADILLO_库变量应该保存库的确切位置,而不是库所在的目录。所以,也许这会奏效:

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的这一页说明了吗


如果将来有进一步的问题,请随时在Trac上提交错误报告。我只是偶然发现了这个问题,所以我不监视堆栈溢出的问题。

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

#define ARMA_USE_LAPACK 
#define ARMA_USE_WRAPPER
在文件中

include/armadillo_bits/config.hpp
这是犰狳的来源树


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

是的,您肯定需要target_link_libraries()在您自己的CMakeLists.txt中链接到犰狳。你能大量发布你的CMakeLists.txtThx的完整/相关部分吗。我想知道我是否真的可以发布整个文件,它相当长。对于相关部分,我只找到了一行“find_包(Armadillo 2.4.2必选)”和一行“include_目录(${Armadillo_include_DIRS})”。但我是一个真正的初学者,我可能会错过一些东西。完整的文件在这里:我刚刚做了文章中描述的更改…添加了如下内容:target_link_库(gmm.exe${ARMADILLO_库})。看看这是否有效。或者只需使用“gmm”而不是“gmm.exe”,然后再次尝试使用.exe,cmake会抱怨gmm.exe不是使用此项目生成的。如果没有.exe,cmake会抱怨gmm不是在这个目录中生成的…Thx!尝试了此操作,但我得到了以下错误:C:/Program Files(x86)/CMake 2.8/share/CMake-2.8/Modules/FindPackageHandleStandardArgs.CMake:97(消息):找不到Armadillo:找到了不合适的版本“0.0.0”,但至少需要“2.4.2”(找到C:/Program Files(x86)/Armadillo/libarmadillo.dll)。。。是不是我的犰狳装置搞砸了?是的,很可能。您是否使用与编译犰狳相同的MLPack生成器?(MinGW?)看起来Armadillo库找到得很正确,但无法正确读取它以找到它的版本。我使用cmake编译Armadillo,然后使用mingw32进行安装。现在,我只是再次执行了它,没有对cmake文件做任何更改(除了删除缓存和树),一切都很顺利(和我几天前做的一样)。现在我不知道我上次在哪里搞砸了,因为在那之后,使用cmake for mlpack似乎对armadillo(检测版本3.800.2)感到满意。但现在我有了关于libxml2的警告(“目标可能只链接到库”)。没有编译libxml2,只是下载了二进制文件。。。可能是因为这个?(顺便说一句,super-thx为您提供帮助)我们现在就到了:-)您也没有显式地设置
LIBXML2\u库,是吗?如果是这样,它可能还应该引用库,而不是库所在的文件夹。我自己不使用MinGW,但看起来libxml2的Windows二进制文件只适合与MSVC一起使用,而不是MinGW。您需要使用mingw32-make构建libxml2,或者使用mingw-get获取它。尝试在谷歌上搜索“libxml2mingw”,现在正与libxml2()斗争。。。将在解决此问题后立即返回(arghhh)。