CMake如何访问外部头文件?项目编译报错求助
问题解决:CMake子目录无法找到上级目录头文件的问题
错误根源
你遇到的CMake报错不是编译时找不到头文件,而是CMake生成阶段找不到作为源文件传入的external_header.h。原因是在底层CMakeLists.txt的add_executable中,你直接写了external_header.h,但该文件位于上级目录,CMake默认只会在当前子目录下查找,因此找不到文件导致生成失败。
同时你的代码还存在两处语法/逻辑问题:
- 顶层CMakeLists.txt中提前调用了
target_include_directories,此时目标还未创建,属于无效代码 - 头文件中的
#pragma oncestatic语法错误,正确写法是#pragma once单独占一行
修正方案
1. 修正顶层CMakeLists.txt
移除无效的target_include_directories调用,修改后内容:
cmake_minimum_required (VERSION 3.28) project ("cmake_test_external_headers") add_subdirectory ("cmake_test_external_headers")
2. 修正底层CMakeLists.txt
- 修正
external_header.h的路径,使用上级目录相对路径 - 移除全局
include_directories,优先使用目标级别的target_include_directories(现代CMake规范)
修改后内容:
string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UC) # 修正头文件路径:使用上级目录相对路径 set(${PROJECT_NAME_UC}_PUBLIC_HEADERS "../external_header.h") set(${PROJECT_NAME_UC}_HEADERS "internal_header.h") set(${PROJECT_NAME_UC}_SOURCES "cmake_test_external_headers.cpp") message("CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}") message("PROJECT_NAME = ${PROJECT_NAME}") message("PROJECT_NAME_UC = ${PROJECT_NAME_UC}") message("${PROJECT_NAME_UC}_PUBLIC_HEADERS: ${${PROJECT_NAME_UC}_PUBLIC_HEADERS}") message("${PROJECT_NAME_UC}_HEADERS: ${${PROJECT_NAME_UC}_HEADERS}") message("${PROJECT_NAME_UC}_SOURCES: ${${PROJECT_NAME_UC}_SOURCES}") add_executable(${PROJECT_NAME} ${${PROJECT_NAME_UC}_PUBLIC_HEADERS} ${${PROJECT_NAME_UC}_HEADERS} ${${PROJECT_NAME_UC}_SOURCES} ) # 仅为当前目标设置包含目录,确保编译器能找到上级目录的头文件 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 20)
3. 修正头文件语法错误
external_header.h修改后:
#pragma once static const int testExt = 456;
internal_header.h修改后:
#pragma once static const int testInt = 123;
4. 可选优化
如果你不需要在IDE中展示external_header.h作为项目文件,可以将它从add_executable的参数中移除——头文件只需通过target_include_directories让编译器找到即可,无需加入目标源文件列表。
内容的提问来源于stack exchange,提问作者Pietro
相关产品推荐
相关产品推荐

