CMake项目下的相对路径问题探索

发布于 2021-01-24  325 次阅读


一、背景

利用CMake构建可跨平台的C++项目,需要引入外部的资源文件,需要根据资源文件相对项目的路径进行读取、写入等操作,如Qt项目需要引入图片文件等情况。

此时就涉及相对路径的资源引入问题。

一般而言,依托于项目的资源文件引用,以依赖于项目的相对路径引入为主流,或是再由相对转绝对,实现项目的跨平台应用,而不是开发环境下测试等绝对路径的应用方式。

二、应用场景实例

项目 说明
编译平台 Windows 10
编辑器 Visual Studio 2019
项目类型 CMake项目
项目名称 CMakeLearnCplus

项目结构如下:

├─CMakeLearnCplus
│  ├─.vs
│  │  └─CMakeLearnCplus
│  ├─archive
│  ├─CMakeLearnCplus
│  │  │─sortArray
│  │  └─res.txt
│  ├─executable
│  ├─out
│  │  └─build
│  │      └─x64-Debug (默认值)
│  │          └─Testing
│  │              └─Temporary
│  └─CMakeLists.txt

顶层的CMakeLists.txt配置如下:

# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
cmake_minimum_required (VERSION 3.8)

project ("CMakeLearnCplus")

# 包含子项目。
add_subdirectory ("CMakeLearnCplus")

此时输出的可执行文件的路径为CMakeLearnCplus\out\build\x64-Debug (默认值)\CMakeLearnCplus\CMakeLearnCplus.exe

假设此时需要读取项目CMakeLearnCplus源代码目录下一个res.txt文件,读取的一般路径:

readFile.open("..\\..\\..\\..\\CMakeLearnCplus\\tes.txt",ios::in);

及默认不修改生成的可执行文件路径的话,CMake项目的相对路径引用起点为CMakeLearnCplus\out\build\x64-Debug (默认值)\CMakeLearnCplus\,执行结果:

file

此种方式引用的相对路径太过繁琐。

(一)\resources文件下

通过CMakeLists.txt修改输出的可执行文件路径如下:

# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
cmake_minimum_required (VERSION 3.8)

project ("CMakeLearnCplus")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/executable)

# 包含子项目。
add_subdirectory ("CMakeLearnCplus")

此时指定相对路径到了CMakeLearnCplus\executable\下。
此时如引用CMakeLearnCplus\resources\下的资源文件,引用的方式如下:

readFile.open("..\\resources\\tes.txt",ios::in);

项目结构如下:

├─CMakeLearnCplus
│  ├─.vs
│  │  └─CMakeLearnCplus
│  ├─archive
│  ├─CMakeLearnCplus
│  │  └─sortArray
│  ├─executable
│  ├─out
│  │  └─build
│  │      └─x64-Debug (默认值)
│  │          └─Testing
│  │              └─Temporary
│  └─resources
│  │  └─res.txt
│  └─CMakeLists.txt

file

(二)存放在executable\resources下

若资源文件存放在指定的输出目录executable下,则引用方式如下:

readFile.open(".\\resources\\tes.txt",ios::in);

项目结构如下:

├─CMakeLearnCplus
│  ├─.vs
│  │  └─CMakeLearnCplus
│  ├─archive
│  ├─CMakeLearnCplus
│  │  └─sortArray
│  ├─executable
│  │  └─res.txt
│  │└─resources
│  ├─out
│  │  └─build
│  │      └─x64-Debug (默认值)
│  │          └─Testing
│  │              └─Temporary
│  └─CMakeLists.txt

file

三、总结

需要指定输出目录作为项目相对路径的起点,指定的方式如下:

  • 修改CMakeLists.txt文件
  • 添加如下代码指定项目的输出目录:
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/executable)