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")
部分內容就可以注釋且不會編譯運行有影響!