Vin*_*nce 5 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")
Run Code Online (Sandbox Code Playgroud)
然后,当我运行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.
Run Code Online (Sandbox Code Playgroud)
在\ mlpack-1.0.4\src\mlpack目录中,我找到了另一个CMakeLists文件:
target_link_libraries(mlpack
${ARMADILLO_LIBRARIES}
${Boost_LIBRARIES}
${LIBXML2_LIBRARIES}
)
Run Code Online (Sandbox Code Playgroud)
我改为(不确定这是不是一个好主意):
target_link_libraries(mlpack
${Boost_LIBRARIES}
)
link_directories(mlpack
${ARMADILLO_LIBRARIES}
${LIBXML2_LIBRARIES}
)
Run Code Online (Sandbox Code Playgroud)
然后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
Run Code Online (Sandbox Code Playgroud)
但现在运行时我有很多这样的错误:
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_'
Run Code Online (Sandbox Code Playgroud)
调查后似乎与犰狳有关.
知道发生了什么事吗?我想我应该为Armadillo使用target_link_libraries,但我不知道如何.
希望这个问题很容易解决.当你这样做......
set(ARMADILLO_LIBRARY "C:\\Program Files (x86)\\armadillo\\lib")
set(ARMADILLO_INCLUDE_DIR "C:\\Program Files (x86)\\armadillo\\include")
Run Code Online (Sandbox Code Playgroud)
你有效地缩短了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已设置为链接到${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和ARMADILLO_INCLUDE_DIR,并恢复您在SRC\mlpack \的CMakeLists.txt变化(使用link_directories通常是一个坏主意,反正).
做了这些改变后,你应该至少删除您CMakeCache.txt(在构建树的根),甚至你的整个生成树重新运行前的CMake以避免以前的失败尝试用恶劣缓存值的可能性.
我意识到这是一个迟到的答案,我希望你现在已经弄清楚了.即便如此,我相信你的问题是ARMADILLO_LIBRARY变量应该保存库的确切位置,而不是库所在的目录.所以,这可能会起作用:
set(ARMADILLO_LIBRARY "C:\\Program Files (x86)\\armadillo\\lib\\armadillo.lib")
set(ARMADILLO_INCLUDE_DIR "C:\\Program Files (x86)\\armadillo\\include")
Run Code Online (Sandbox Code Playgroud)
变量LIBXML2_LIBRARIES还应包含libxml2.lib的实际路径(或者调用实际库的任何路径).
你有没有看到我在一段时间后编写的用于在Windows上编译mlpack的说明页面?
http://www.mlpack.org/trac/wiki/MLPACKOnWindows
如果您将来还有其他问题,请随时提交有关Trac的错误报告.我偶然偶然发现了这个,所以我不会监视Stack Overflow的问题.
| 归档时间: |
|
| 查看次数: |
12800 次 |
| 最近记录: |