CMake无法定位头文件的报错问题及解决方法咨询
CMake头文件包含路径错误修复

base目录下的CMakeLists.txt内容:
# leaf files add_library(Account "") target_sources(Account PRIVATE ${CMAKE_CURRENT_LIST_DIR}/Account.cpp PUBLIC ${CMAKE_CURRENT_LIST_DIR}/Account.h ) target_include_directories( Account PUBLIC ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_SOURCE_DIR}/initial/initial )
编译报错信息
====================[ Build | all | Debug ]===================================== "C:\Program Files\JetBrains\CLion 2020.2.1\bin\cmake\win\bin\cmake.exe" --build C:\Users\pc\git\cmake_test\cmake-build-debug --target all -- -j 3 Scanning dependencies of target Account [ 37%] Built target Initial [ 25%] Building CXX object src/models/CMakeFiles/SavingsAccount.dir/SavingsAccount.cpp.obj [ 50%] Building CXX object src/models/base/CMakeFiles/Account.dir/Account.cpp.obj C:\Users\pc\git\cmake_test\src\models\SavingsAccount.cpp:6:10: fatal error: initial/initial/initial.h: No such file or directory 6 | #include <initial/initial/initial.h> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. C:\Users\pc\git\cmake_test\src\models\base\Account.cpp:6:10: fatal error: initial/initial/initial.h: No such file or directory 6 | #include <initial/initial/initial.h> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. mingw32-make[2]: *** [src\models\CMakeFiles\SavingsAccount.dir\build.make:83: src/models/CMakeFiles/SavingsAccount.dir/SavingsAccount.cpp.obj] Error 1 mingw32-make[1]: *** [CMakeFiles\Makefile2:231: src/models/CMakeFiles/SavingsAccount.dir/all] Error 2 mingw32-make[1]: *** Waiting for unfinished jobs.... mingw32-make[2]: *** [src\models\base\CMakeFiles\Account.dir\build.make:83: src/models/base/CMakeFiles/Account.dir/Account.cpp.obj] Error 1 mingw32-make[1]: *** [CMakeFiles\Makefile2:204: src/models/base/CMakeFiles/Account.dir/all] Error 2 mingw32-make: *** [makefile:103: all] Error 2
问题原因
你在target_include_directories里指定了${CMAKE_SOURCE_DIR}/initial/initial,但代码里写的是#include <initial/initial/initial.h>,相当于编译器要找${CMAKE_SOURCE_DIR}/initial/initial/initial/initial/initial.h,路径多嵌套了一层,自然找不到文件。
解决方法
方法1:修正CMake包含路径
把target_include_directories里的路径改成项目根目录${CMAKE_SOURCE_DIR},这样编译器就能从根目录定位到initial/initial/initial.h:
target_include_directories( Account PUBLIC ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_SOURCE_DIR} )
方法2:调整头文件包含语句
如果不想改CMake配置,把代码里的包含语句改成#include "initial.h",同时保留${CMAKE_SOURCE_DIR}/initial/initial的包含路径,编译器会直接在该目录下查找initial.h:
#include "initial.h"
方法3:更规范的CMake依赖管理
从报错看已经有Initial目标,建议给Initial目标单独配置包含目录,然后让Account链接Initial,CMake会自动传递包含路径,避免手动维护:
- 在
initial/initial目录的CMakeLists.txt中添加:
add_library(Initial "") target_sources(Initial PRIVATE initial.cpp PUBLIC initial.h) target_include_directories(Initial PUBLIC ${CMAKE_CURRENT_LIST_DIR})
- 修改
base目录的CMakeLists.txt:
add_library(Account "") target_sources(Account PRIVATE Account.cpp PUBLIC Account.h) target_include_directories(Account PUBLIC ${CMAKE_CURRENT_LIST_DIR}) # 链接Initial目标,自动获取其包含目录 target_link_libraries(Account PUBLIC Initial)
- 代码里的包含语句改为:
#include <initial.h>
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

