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
相关产品推荐
相关产品推荐

