include_directories()的使用
今天在运行一个cmakelist.txt如下所示时候,发现一个问题:
cmake_minimum_required(VERSION 3.28)
project(l_trajectoryError CXX)
option(USE_UBUNTU_20 "Set to ON if you are using Ubuntu 20.04" OFF)
find_package(Pangolin REQUIRED)
find_package(Sophus REQUIRED)
# if(USE_UBUNTU_20)
# message("You are using Ubuntu 20.04, fmt::fmt will be linked")
# find_package(fmt REQUIRED)
# set(FMT_LIBRARIES fmt::fmt)
# endif()
message(STATUS "Souph_INCLUDE_DIRS: ${Sophus_INCLUDE_DIRS}")
include_directories(${Pangolin_INCLUDE_DIRS})
include_directories(${Sophus_INCLUDE_DIRS})
add_executable(l_trajectoryError l_trajectoryError.cpp)
target_link_libraries(l_trajectoryError ${Pangolin_LIBRARIES})
执行cmake ..
命令出现下图所示提示信息:
图中红色标记的路径是我以前sudo make install
命令后安装到系统层面的sophus文件夹路径,但这个版本和我现在代码用的版本不一致,按道理使用这个路径的sophus库肯定有报错,不可能运行,所以引发我的深思。
后面我把cmakelist文件中的include_directories(${Sophus_INCLUDE_DIRS})
代码注释了,项目依然能很好的编译和运行,也就是项目没有使用find_package(Sophus REQUIRED)找到的sophus头文件。
回到我的项目代码中,我的include用的是项目中的sophus得完整相对路径,也就是编译的时候可能就自动选择了这个路径下的sophus头文件。
那么include_directories()作用到底是什么,它是指定非标准库的头文件具体位置,但为什么上述情况这么特殊?
下图分别是一个cmakelist文件和项目文件。
cmakelist文件中的include_directories(“/usr/include/eigen3”),而项目文件中的include是
#include <Eigen/Core>
#include <Eigen/Geometry>,而实际eigen储存位置如下图红线所示:
我悟了:
项目中我们这样写include,编辑器能找到eigen所在位置是因为我们在c_cpp_properties.json文件中注明了includepath,如下图所示:
所以项目中这样写:#include <Eigen/Core> #include<Eigen/Geometry>会自动到includepath中包含的路径中递归搜索,也就找到了,也就是这个include是不全的路径,而Cmakelist文件中的include_directories(“/usr/include/eigen3”)补全了完整路径的剩余部分,让cmake能够知到eigen3的完整路径,符合逻辑!!!
因此,假如我们在项目文件中用#include “/usr/include/eigen3/Eigen/Core”
#include “/usr/include/eigen3/Eigen/Geometry"代替,则cmakelist中include_directories(”/usr/include/eigen3")
部分内容就可以注释且不会编译运行有影响!