一、背景
利用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\
,执行结果:
此种方式引用的相对路径太过繁琐。
(一)\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
(二)存放在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
三、总结
需要指定输出目录作为项目相对路径的起点,指定的方式如下:
- 修改CMakeLists.txt文件
- 添加如下代码指定项目的输出目录:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/executable)
Comments | NOTHING