CMake构建含Eigen3的C++项目时头文件找不到的问题及解决
问题:编译含Eigen3的库时提示头文件不存在
项目结构
Eigen Dense ... pricing CMakeLists.txt options.cpp options.h CMakeLists.txt main.cpp
各文件代码
main.cpp
#include "pricing/options.h" int main() { fun(); }
根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.22.0) project(my_application VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(quant_finance_app main.cpp ) add_subdirectory(pricing) target_link_libraries(quant_finance_app pricing_lib)
pricing/options.h
#pragma once #include <iostream> #include <Eigen/Dense> using Eigen::MatrixXd; void fun();
pricing/options.cpp
#include "options.h" void fun() { MatrixXd m(2,2); m(0,0) = 3; m(1,0) = 2.5; m(0,1) = -1; m(1,1) = m(1,0) + m(0,1); std::cout << m << std::endl; }
pricing/CMakeLists.txt(原错误版本)
add_library(pricing_lib options.cpp) target_include_directories(pricing_lib PRIVATE ../)
编译错误
编译options.cpp时出现如下错误:
fatal error: Eigen/Dense: No such file or directory 4 | #include <Eigen/Dense>
问题原因
target_include_directories中使用PRIVATE关键字时,仅会将指定目录添加到当前目标(pricing_lib)的编译包含路径中,但当目标的头文件(options.h)被其他目标(比如主程序quant_finance_app)包含时,这个包含路径不会传递给依赖它的目标。而options.h中直接包含了<Eigen/Dense>,导致编译依赖pricing_lib的代码时,编译器无法找到Eigen的头文件目录。
解决方案
将pricing/CMakeLists.txt中的PRIVATE替换为PUBLIC:
add_library(pricing_lib options.cpp) target_include_directories(pricing_lib PUBLIC ../)
PUBLIC关键字的作用是:既将目录添加到当前目标的编译包含路径,也会把这个路径传递给所有依赖该目标的其他目标,这样无论是编译pricing_lib本身,还是编译依赖它的主程序,都能找到Eigen的头文件目录。
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

