CMake引入当前目录外相对路径失败,如何修改CMakeLists.txt?
编译报错:找不到common_util.h的解决方法
目录结构
my_dir CMakeLists.txt my_cpp.cpp common_utils common_util.h common_util.cpp
问题分析
你当前在my_dir/CMakeLists.txt里写的include_directories(${CMAKE_SOURCE_DIR}/../common_utils)存在路径歧义问题:CMAKE_SOURCE_DIR指代的是顶层CMakeLists.txt所在的目录,如果你的构建目录不在my_dir内部,或者没有从正确的目录启动cmake,这个路径就会指向错误位置,导致编译器找不到头文件。
修正方案
方案1:用当前CMakeLists的路径计算(最直接)
改用CMAKE_CURRENT_LIST_DIR(当前CMakeLists.txt所在目录的绝对路径)来拼接路径,这个变量的取值不受构建目录位置影响:
include_directories(${CMAKE_CURRENT_LIST_DIR}/../common_utils)
方案2:规范的CMake模块化写法(推荐)
把common_utils做成独立的库模块,不仅能解决头文件问题,还能自动管理依赖:
- 给
common_utils目录添加一个CMakeLists.txt:
add_library(common_utils STATIC common_util.cpp common_util.h) # 公开当前目录作为头文件路径,链接此库的目标会自动继承 target_include_directories(common_utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
- 修改
my_dir/CMakeLists.txt:
# 引入common_utils子模块 add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../common_utils ${CMAKE_BINARY_DIR}/common_utils) # 编译你的主程序 add_executable(my_program my_cpp.cpp) # 链接common_utils库,CMake会自动处理头文件路径 target_link_libraries(my_program PRIVATE common_utils)
这种写法不需要手动写include_directories,后续维护更省心。
方案3:确保构建目录正确
如果你习惯用内部build目录,要保证从正确的位置执行cmake:
cd my_dir mkdir build && cd build cmake .. make
此时CMAKE_SOURCE_DIR会正确指向my_dir,原来的路径写法也能生效,但还是推荐方案1或2,避免路径依赖构建位置。
内容的提问来源于stack exchange,提问作者Qi Huaping
相关产品推荐
相关产品推荐

