CMake技术问题:如何在project2中引入上级src目录作为包含目录?
看起来你遇到的核心问题是路径计算错误,加上没有正确告诉CMake头文件的搜索路径。先理清楚你的目录层级:
myproject/ ├─ lib/ ├─ src/ └─ project2/ ├─ CMakeLists.txt └─ test.cpp
当你在project2目录下的CMakeLists.txt中,CMAKE_CURRENT_SOURCE_DIR(当前CMakeLists所在目录)就是myproject/project2,要访问上级目录的src,只需要向上走一级再进入src,也就是${CMAKE_CURRENT_SOURCE_DIR}/../src,而你之前写的../../会走到myproject的上级目录,这显然找不到你要的src文件夹。
下面给你两种可行的解决方案:
方案1:修正CMakeLists.txt(推荐)
你不需要手动拼接-I参数,CMake有专门的指令来管理头文件路径。替换你现有的CMakeLists.txt内容为:
cmake_minimum_required(VERSION 3.10) project(TestExecutable) # 先定义可执行目标 add_executable(test_runner test.cpp) # 为目标添加私有头文件搜索路径(PRIVATE表示仅当前目标使用) target_include_directories(test_runner PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../src)
如果习惯用全局的头文件路径,也可以用include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src),但更推荐target_include_directories,它是目标级别的管理,更清晰。
方案2:直接用g++编译(跳过CMake)
如果你只是想快速单独编译test.cpp,不需要通过CMake的话,直接在project2目录下运行以下命令:
g++ test.cpp -o test -I../src
这里的-I../src就是告诉编译器去上级目录的src文件夹找头文件。
为什么你之前的方法无效?
你用set(MORE_INCLUDE_DIR "-I${CMAKE_SOURCE_DIR}../../")只是定义了一个变量,但CMake不会自动把这个变量应用到编译命令中,除非你手动把它传递给add_compile_options或者目标的编译选项,但这种方式不如官方提供的头文件管理指令规范,而且路径本身也写错了。
内容的提问来源于stack exchange,提问作者N.hwang

