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

CMake链接库问题求助:编译时无法找到头文件

CMake构建头文件找不到问题的解决

项目结构

Game/ (root)
    CMakeLists.txt
    main.cpp
    GameLib1/
        CMakeLists.txt
        GameLib1_1/
            CMakeLists.txt
            file1.cpp
            file1.h
            file2.cpp
            file2.h

现有CMake配置

Game/CMakeLists.txt

project(Game)

add_subdirectory(GameLib1)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} GameLibrary)

Game/GameLib1/CMakeLists.txt

add_subdirectory(GameLib1_1)

Game/GameLib1/GameLib1_1/CMakeLists.txt

set(GameLibrary_src_files StateMan.cpp StateMan.h
                    State.cpp State.h)

add_library(GameLibrary ${GameLibrary_src_files})

报错信息

[build] /home/user/Game/main.cpp:2:10: fatal error: State.h: No such file or directory

[build]     2 | #include <file1.h>
[build]       |          ^~~~~~~~~

问题分析与修正

1. 源文件列表与实际文件不匹配

GameLib1_1的CMake配置中,GameLibrary_src_files列出的StateMan.cpp、State.cpp等文件不存在,但项目实际文件为file1.cpp、file2.cpp,这会导致库编译时未包含正确源文件,进而引发后续头文件引用问题。

2. 未设置头文件搜索路径

main.cpp使用<file1.h>格式引用头文件,但编译器默认不会去GameLib1/GameLib1_1目录查找,必须通过CMake配置将该目录添加到头文件搜索路径,并传递给链接库的可执行文件。

修正后的Game/GameLib1/GameLib1_1/CMakeLists.txt

set(GameLibrary_src_files file1.cpp file1.h
                    file2.cpp file2.h)

add_library(GameLibrary ${GameLibrary_src_files})

# 将当前目录设为公共头文件路径,让链接该库的Game可执行文件能找到头文件
target_include_directories(GameLibrary
    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
)

解释:

  • 修正源文件列表:匹配项目实际存在的文件,确保库正确编译。
  • target_include_directories使用PUBLIC关键字,意味着该头文件路径会被传递给所有链接GameLibrary的目标,Game可执行文件编译时会自动将GameLib1/GameLib1_1加入头文件搜索路径,解决#include <file1.h>找不到文件的问题。

内容的提问来源于stack exchange,提问作者Shizo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:33:28