Visual Studio的CMake项目能否引用父目录源文件并实现远程Linux同步
疑问1解答:CMake可以引用父目录文件
该说法不属实,CMake本身没有限制源文件必须存放在CMakeLists.txt所在目录或其子目录下,只要路径配置正确,完全可以引用任意位置的源文件。
疑问2解答:CMake编写规则与远程同步逻辑
CMake引用父目录文件写法
在子项目的CMakeLists.txt中可以通过相对路径或者全局变量拼接的方式定位父目录文件,示例如下:
# 基于当前CMakeLists.txt所在目录的相对路径写法 set(PROJECT1_SRC ../../src1/project1.cpp ../../src2/utils.cpp) # 基于顶层源码目录的全局路径写法(更稳妥,避免相对路径层级错误) set(PROJECT1_SRC ${CMAKE_SOURCE_DIR}/src1/project1.cpp ${CMAKE_SOURCE_DIR}/src2/utils.cpp) add_executable(project1 ${PROJECT1_SRC} main.cpp)
远程同步问题原因
你之前遇到的找不到文件报错,不是CMake路径配置错误,是Visual Studio的远程同步规则默认只同步CMake根目录下的文件,上层的src、external-libs目录没有被同步到Linux远程系统,导致编译阶段找不到对应文件。
疑问3解答:CMakeSettings.json支持指定源码根目录
你的认知有误,VS的CMakeSettings.json完全支持自定义源码根目录,同时还支持配置额外的同步目录,有两种成熟方案可以解决你的问题:
方案1:新增顶层CMakeLists.txt(推荐)
该方案不需要修改同步规则,维护成本最低:
- 在
/trunk目录下新建顶层CMakeLists.txt,示例内容:
cmake_minimum_required(VERSION 3.16) project(AllTrunkProjects) # 全局头文件搜索路径,子项目可直接复用 include_directories( ${CMAKE_SOURCE_DIR}/src1 ${CMAKE_SOURCE_DIR}/src2 ${CMAKE_SOURCE_DIR}/external-libs/include ) # 导入子项目 add_subdirectory(projects/project1) add_subdirectory(projects/project2)
- 打开你的
CMakeSettings.json,将sourceDirectory配置项的值改为${workspaceRoot}(前提是VS打开的工作区根目录为/trunk)。此时VS会默认同步整个/trunk目录到远程,所有源文件都会被上传。 - 子项目的CMakeLists.txt直接用
${CMAKE_SOURCE_DIR}拼接路径引用对应源文件即可。
方案2:配置额外同步目录(无需修改现有CMake结构)
如果你不想新增顶层CMakeLists,保持当前project1、project2独立的项目结构,可以直接在CMakeSettings.json中配置额外同步目录:
打开CMakeSettings.json,在对应远程配置段中添加copySourcesOptions配置,示例如下:
{ "configurations": [ { "name": "Linux-Debug", "generator": "Unix Makefiles", "remoteMachineName": "你配置的远程Linux主机名", "sourceDirectory": "${workspaceRoot}/projects/project1", "copySourcesOptions": { "additionalSourcesToCopy": [ { "source": "${workspaceRoot}/src1", "destination": "${remoteSourceRoot}/src1" }, { "source": "${workspaceRoot}/src2", "destination": "${remoteSourceRoot}/src2" }, { "source": "${workspaceRoot}/external-libs", "destination": "${remoteSourceRoot}/external-libs" } ] } } ] }
配置完成后重新生成CMake缓存,VS会自动把你指定的上层目录同步到远程对应路径,CMake即可正常找到源文件。
内容的提问来源于stack exchange,提问作者Manuel Jouglet Marcus
相关产品推荐
相关产品推荐

