添加Source子目录后CMake项目无法找到GLFW头文件的原因
问题:添加Source子目录后无法找到GLFW头文件
项目目录结构
Project Dependencies glfw Source CMakeLists.txt main.cpp CMakeLists.txt
初始可正常构建的根CMakeLists.txt配置
cmake_minimum_required(VERSION 3.8) # Enable Hot Reload for MSVC compilers if supported. if (POLICY CMP0141) cmake_policy(SET CMP0141 NEW) set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>") endif() project( Project ) # Include sub - projects. set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) set(MAIN "Source/main.cpp") add_subdirectory("Dependencies/glfw") add_executable( Project ${MAIN} ) target_link_libraries( Project glfw )
问题复现
在根CMakeLists.txt中添加add_subdirectory("Source")语句后,编译main.cpp时出现错误:无法找到GLFW/glfw3.h文件。
main.cpp代码:
#include <stdio.h> #include <stdlib.h> #include <GLFW/glfw3.h> int main() { //glewExperimental = true; // Needed for core profile if (!glfwInit()) { fprintf(stderr, "Failed to initialize GLFW\n"); return -1; } }
Source目录下的CMakeLists.txt内容:
add_executable (CMakeTarget "Game Engine.cpp" ) if (CMAKE_VERSION VERSION_GREATER 3.12) set_property(TARGET CMakeTarget PROPERTY CXX_STANDARD 20) endif()
错误原因分析
- 初始配置中,根目录的可执行目标
Project直接包含main.cpp,并通过target_link_libraries(Project glfw)关联GLFW库。GLFW的CMake脚本会自动将自身的头文件目录通过INTERFACE_INCLUDE_DIRECTORIES属性传递给链接它的目标,因此编译Project时能正确找到GLFW的头文件。 - 添加
add_subdirectory("Source")后,Source子目录的CMake脚本创建了新的可执行目标CMakeTarget,但这个目标没有配置GLFW依赖:既没有通过target_link_libraries链接GLFW,也没有手动添加GLFW的头文件包含路径。 - 问题核心是你可能误将编译目标切换为
CMakeTarget而非原来的Project。如果CMakeTarget对应的源文件(比如Game Engine.cpp)也包含了GLFW头文件,或者你不小心把main.cpp纳入了CMakeTarget的编译范围,就会触发找不到头文件的错误;即使main.cpp仍属于Project目标,若错误选择CMakeTarget进行编译,也会出现该报错。
内容的提问来源于stack exchange,提问作者Rostik Romanets
相关产品推荐
相关产品推荐

