CMake 查找本征不正确的结果
CMake find eigen incorrect results
我正在尝试使用 CMake Eigen
编译代码片段,但 CMake 似乎无法找到正确的路径,即使源代码在那里。
这是我的 CMakeLists.txt
文件。
cmake_minimum_required(VERSION 3.14.2)
project(test)
# set default build type
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
find_package(OpenCV 3 REQUIRED)
find_package (Eigen3 3.3 REQUIRED NO_MODULE)
include_directories(
include
${OpenCV_INCLUDE_DIRS}
${EIGEN3_INCLUDE_DIR}
)
add_executable(playground playground.cpp)
target_link_libraries(playground ${OpenCV_LIBS} Eigen3::Eigen)
这就是我在 playground.cpp
中导入 headers 的方式:
#include <iostream>
#include <vector>
#include <map>
#include <math.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <string>
#include <Eigen>
我的Eigen
安装在/usr/include/eigen3
下,目录结构如下:
yuqiong@yuqiong-G7-7588:/usr/include/eigen3$ ls
Eigen signature_of_eigen3_matrix_library unsupported
所以 Eigen 库的正确路径是 /usr/include/eigen3/Eigen
.
然而,当我 运行 cmake ..
然后 make
用于上述 CMakeLists.txt
文件时,使用 -LH
标志,CMake 抱怨它不能'找不到 Eigen
。这是它认为 Eigen
所在的路径:
yuqiong@yuqiong-G7-7588:/media/yuqiong/DATA/vignetting/catkin_ws/src/vig2/src/build$ cmake -LH ..
-- Configuring done
-- Generating done
-- Build files have been written to: /media/yuqiong/DATA/vignetting/catkin_ws/src/vig2/src/build
-- Cache values
// Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ...
CMAKE_BUILD_TYPE:STRING=
// Install path prefix, prepended onto install directories.
CMAKE_INSTALL_PREFIX:PATH=/usr/local
// The directory containing a CMake configuration file for Eigen3.
Eigen3_DIR:PATH=/usr/local/share/eigen3/cmake
// The directory containing a CMake configuration file for OpenCV.
OpenCV_DIR:PATH=/opt/ros/kinetic/share/OpenCV-3.3.1-dev
这是它认为 Eigen 所在文件夹的结构:
yuqiong@yuqiong-G7-7588:/usr/local/share/eigen3$ tree
.
└── cmake
├── Eigen3Config.cmake
├── Eigen3ConfigVersion.cmake
├── Eigen3Targets.cmake
└── UseEigen3.cmake
我很困惑为什么 CMake 有这样的行为?在这种情况下,如何让它找到 Eigen
的正确路径?
所有这些环境 set-ups 很难做到正确...
感谢以上评论。我认为问题可能是 Eigen
团队在不同版本之间以某种方式更改了目录结构,旧的包含路径不再起作用。
我的解决方案是将 #include <Eigen/Dense>
更改为 #include <eigen3/Eigen/Dense>
。之后g++
和CMake
就可以找到路径了。
我确实在 this official doc 之后安装了 Eigen
,这就是为什么我很惊讶安装仍然有问题的原因。
This 回答解决了我的问题。
This 回答也解决了问题。
另一方面,我的 CMake 文件有点乱,同时包含 include_directories
和 target_link_libraries
。
我正在尝试使用 CMake Eigen
编译代码片段,但 CMake 似乎无法找到正确的路径,即使源代码在那里。
这是我的 CMakeLists.txt
文件。
cmake_minimum_required(VERSION 3.14.2)
project(test)
# set default build type
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
find_package(OpenCV 3 REQUIRED)
find_package (Eigen3 3.3 REQUIRED NO_MODULE)
include_directories(
include
${OpenCV_INCLUDE_DIRS}
${EIGEN3_INCLUDE_DIR}
)
add_executable(playground playground.cpp)
target_link_libraries(playground ${OpenCV_LIBS} Eigen3::Eigen)
这就是我在 playground.cpp
中导入 headers 的方式:
#include <iostream>
#include <vector>
#include <map>
#include <math.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <string>
#include <Eigen>
我的Eigen
安装在/usr/include/eigen3
下,目录结构如下:
yuqiong@yuqiong-G7-7588:/usr/include/eigen3$ ls
Eigen signature_of_eigen3_matrix_library unsupported
所以 Eigen 库的正确路径是 /usr/include/eigen3/Eigen
.
然而,当我 运行 cmake ..
然后 make
用于上述 CMakeLists.txt
文件时,使用 -LH
标志,CMake 抱怨它不能'找不到 Eigen
。这是它认为 Eigen
所在的路径:
yuqiong@yuqiong-G7-7588:/media/yuqiong/DATA/vignetting/catkin_ws/src/vig2/src/build$ cmake -LH ..
-- Configuring done
-- Generating done
-- Build files have been written to: /media/yuqiong/DATA/vignetting/catkin_ws/src/vig2/src/build
-- Cache values
// Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ...
CMAKE_BUILD_TYPE:STRING=
// Install path prefix, prepended onto install directories.
CMAKE_INSTALL_PREFIX:PATH=/usr/local
// The directory containing a CMake configuration file for Eigen3.
Eigen3_DIR:PATH=/usr/local/share/eigen3/cmake
// The directory containing a CMake configuration file for OpenCV.
OpenCV_DIR:PATH=/opt/ros/kinetic/share/OpenCV-3.3.1-dev
这是它认为 Eigen 所在文件夹的结构:
yuqiong@yuqiong-G7-7588:/usr/local/share/eigen3$ tree
.
└── cmake
├── Eigen3Config.cmake
├── Eigen3ConfigVersion.cmake
├── Eigen3Targets.cmake
└── UseEigen3.cmake
我很困惑为什么 CMake 有这样的行为?在这种情况下,如何让它找到 Eigen
的正确路径?
所有这些环境 set-ups 很难做到正确...
感谢以上评论。我认为问题可能是 Eigen
团队在不同版本之间以某种方式更改了目录结构,旧的包含路径不再起作用。
我的解决方案是将 #include <Eigen/Dense>
更改为 #include <eigen3/Eigen/Dense>
。之后g++
和CMake
就可以找到路径了。
我确实在 this official doc 之后安装了 Eigen
,这就是为什么我很惊讶安装仍然有问题的原因。
This 回答解决了我的问题。
This 回答也解决了问题。
另一方面,我的 CMake 文件有点乱,同时包含 include_directories
和 target_link_libraries
。