You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:51:26