【问题标题】:CMake: find Armadillo library installed in a custom locationCMake:找到安装在自定义位置的犰狳库
【发布时间】:2016-02-09 23:55:54
【问题描述】:

集群上没有 root 访问权限,安装 Armadillo 与

make install DEST_DIR=/home/my_id/include

现在我不知道如何设置find_package(ARMADILLO REQUIRED) 来设置${ARMADILLO_INCLUDE_DIRS}${ARMADILLO_LIBRARIES}

【问题讨论】:

  • 如果您将Armadillo 配置为CMake 项目(使用cmake 命令),那么您应该将安装前缀传递给此命令:cmake -DCMAKE_INSTALL_PREFIX=/home/my_id/include <source-dir>。构造make install DEST_DIR=... 主要用于打包 目的:生成的文件不适用于DEST_DIR,它们需要移动到根目录(/)。
  • 在将犰狳安装设置环境变量CMAKE_PREFIX_PATH改成安装前缀/home/my_id/include后,find_package就可以正常工作了。

标签: cmake armadillo


【解决方案1】:

使用CMAKE_LIBRARY_PATH and/or CMAKE_PREFIX_PATH environment variables 指定查找库和头文件的其他路径。

另见cmake - find_library - custom library location,但那里的所有答案都建议编辑 CMakeLists.txt,这有时可能会有点不方便。

编辑:这是完整的工作示例:

alex@rhyme /var/tmp $ tar zxf armadillo-6.500.4.tar.gz 
alex@rhyme /var/tmp $ cd armadillo-6.500.4 
alex@rhyme /var/tmp/armadillo-6.500.4 $ mkdir build
alex@rhyme /var/tmp/armadillo-6.500.4 $ cd build 
alex@rhyme tmp/armadillo-6.500.4/build $ cmake ..
-- Configuring Armadillo 6.500.4
...
-- CMAKE_INSTALL_PREFIX = /usr
-- INSTALL_LIB_DIR      = /usr/lib64
-- INSTALL_INCLUDE_DIR  = /usr/include
-- INSTALL_DATA_DIR     = /usr/share
-- INSTALL_BIN_DIR      = /usr/bin
-- Generating '/var/tmp/armadillo-6.500.4/build/ArmadilloConfig.cmake'
-- Generating '/var/tmp/armadillo-6.500.4/build/ArmadilloConfigVersion.cmake'
-- Generating '/var/tmp/armadillo-6.500.4/build/InstallFiles/ArmadilloConfig.cmake'
-- Generating '/var/tmp/armadillo-6.500.4/build/InstallFiles/ArmadilloConfigVersion.cmake'
-- Configuring done
-- Generating done
-- Build files have been written to: /var/tmp/armadillo-6.500.4/build
alex@rhyme tmp/armadillo-6.500.4/build $ make -j4
Scanning dependencies of target armadillo
[100%] Building CXX object CMakeFiles/armadillo.dir/src/wrapper.cpp.o
Linking CXX shared library libarmadillo.so
[100%] Built target armadillo
alex@rhyme tmp/armadillo-6.500.4/build $ make install DESTDIR=/var/tmp/armadillo
[100%] Built target armadillo
Install the project...
-- Install configuration: ""
-- Installing: /var/tmp/armadillo/usr/include
-- Installing: /var/tmp/armadillo/usr/include/armadillo_bits
-- Installing: /var/tmp/armadillo/usr/include/armadillo_bits/spop_htrans_bones.hpp
...
-- Installing: /var/tmp/armadillo/usr/include/armadillo_bits/subview_elem2_bones.hpp
-- Installing: /var/tmp/armadillo/usr/include/armadillo
-- Installing: /var/tmp/armadillo/usr/lib64/libarmadillo.so.6.500.4
-- Installing: /var/tmp/armadillo/usr/lib64/libarmadillo.so.6
-- Installing: /var/tmp/armadillo/usr/lib64/libarmadillo.so
-- Installing: /var/tmp/armadillo/usr/share/Armadillo/CMake/ArmadilloLibraryDepends.cmake
-- Installing: /var/tmp/armadillo/usr/share/Armadillo/CMake/ArmadilloLibraryDepends-noconfig.cmake
-- Installing: /var/tmp/armadillo/usr/share/Armadillo/CMake/ArmadilloConfig.cmake
-- Installing: /var/tmp/armadillo/usr/share/Armadillo/CMake/ArmadilloConfigVersion.cmake
alex@rhyme tmp/armadillo-6.500.4/build $ cd ../../
alex@rhyme /var/tmp $ mkdir test_armadillo_project 
alex@rhyme /var/tmp $ cd test_armadillo_project 
alex@rhyme /var/tmp/test_armadillo_project $ cat >CMakeLists.txt <<EOF
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

FIND_PACKAGE(Armadillo REQUIRED)
EOF

现在我们尝试在不指定位置的情况下构建包。 CMake 预计会失败:

alex@rhyme /var/tmp/test_armadillo_project $ cmake .
-- The C compiler identification is GNU 5.3.1
-- The CXX compiler identification is GNU 5.3.1
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at /usr/share/CMake/Modules/FindPackageHandleStandardArgs.cmake:138 (message):
  Could NOT find Armadillo (missing: ARMADILLO_LIBRARY ARMADILLO_INCLUDE_DIR)
Call Stack (most recent call first):
  /usr/share/CMake/Modules/FindPackageHandleStandardArgs.cmake:374 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/CMake/Modules/FindArmadillo.cmake:92 (find_package_handle_standard_args)
  CMakeLists.txt:3 (FIND_PACKAGE)


-- Configuring incomplete, errors occurred!
See also "/var/tmp/test_armadillo_project/CMakeFiles/CMakeOutput.log".

现在我们通过环境变量指定自定义路径:

alex@rhyme /var/tmp/test_armadillo_project $ CMAKE_PREFIX_PATH=/var/tmp/armadillo/usr cmake .
-- Found Armadillo: /var/tmp/armadillo/usr/lib64/libarmadillo.so (found version "6.500.4") 
-- Configuring done
-- Generating done
-- Build files have been written to: /var/tmp/test_armadillo_project

我很确定我可以在 CMakeLists.txt 中正确设置 CMAKE_PREFIX_PATH,它的工作原理与上面的环境变量一样。

【讨论】:

  • 这些都不起作用。我查看了 FindArmadillo.cmake,甚至没有使用这些变量。
  • 谢谢。最后我推出了自己的 FindARMADILLO.cmake。
猜你喜欢
  • 2012-04-27
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多