You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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做成独立的库模块,不仅能解决头文件问题,还能自动管理依赖:

  1. 给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})
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:50:32