BestAns

路漫漫其修远兮,吾将上下而求索

Visual Studio / CLion 使用 EasyX 通过相对路径加载图片的详细解释 金牌收录

什么是“相对路径”?

加载图片时,一定要有图片的“绝对路径”才能找到图片。为了方便使用,一个图片的“绝对路径” = “当前路径” + “相对路径”。

例如,当前路径为 D:\Work\Job01,相对路径为 res\cat.png,那么绝对路径就是:D:\Work\Job01\res\cat.png 。

通常情况下,“当前路径”就是 exe 所在路径。当然,也可以独立设置程序执行时的“当前路径”。

Visual Studio 项目的路径设定

基础环境示例

例如,Visual Studio 2012 项目的常见文件结构如下(仅列出主要文件):

D:\Work\Job01\
	├ Debug\  <folder>
	│	└ Job01.exe				// 编译后的可执行文件
	├ res\  <folder>
	│	└ hero.png				// 待加载的图片
	├ main.cpp					// 代码文件
	├ Job01.sln					// 解决方案文件
	└ Job01.vcxproj				// 项目文件

其中,编译后的可执行文件路径是:D:\Work\Job01\Debug\Job01.exe

默认的当前路径是项目文件 Job01.vcxproj 的所在路径,即:D:\Work\Job01

使用相对路径的方案

▶ 在 VS 开发环境下,执行程序时的默认当前路径是:D:\Work\Job01

因此,通过相对路径加载图片的代码这样写:

	loadimage(&img, L"res\\hero.png");		// 如果项目是 MBCS 编码,就去掉字符串前面的 L。

那么图片的绝对路径为:“D:\Work\Job01” + "res\hero.png" = D:\Work\Job01\res\hero.png,可以找到图片。

▶ 在操作系统环境下,双击可执行文件 D:\Work\Job01\Debug\Job01.exe ,那么此时的“当前路径”为 Job01.exe 所在路径,即 D:\Work\Job01\Debug\ ,此时图片的绝对路径为 D:\Work\Job01\Debug\res\hero.png ,这就导致找不到图片。

为了解决这个问题,需要将 res 文件夹拷贝到 Job01.exe 所在路径下,这样在双击 Job01.exe 的时候,就能通过相对路径找到图片 res\hero.png 。

▶ 发布应用时,可以这样组织应用的文件:

D:\App\Job01\
	├ Job01.exe				// 可执行文件
	└ res\  <folder>			// 资源文件夹
		└ hero.png			// 待加载的图片

CLion 项目的路径设定

基础环境示例

例如,CLion 2025.1.3 项目的常见文件结构如下(仅列出主要文件):

D:\Work\Job02\
	├ .idea\  <folder>
	├ cmake-build-debug\  <folder>
	│	└ Job02.exe				// 编译后的可执行文件
	├ res\  <folder>
	│	└ hero.png				// 待加载的图片
	├ CMakeLists.txt			// 编译配置文件
	└ main.cpp					// 代码文件

其中,编译后的可执行文件路径是:D:\Work\Job02\cmake-build-debug\Job02.exe

默认的当前路径是编译后的可执行文件 Job02.exe 的所在路径,即:D:\Work\Job02\cmake-build-debug

使用相对路径的方案一(推荐)

▶ 在 CLion 开发环境下,通过修改 CMakeLists.txt 使相关图片资源自动拷贝到编译输出文件夹下,修改方法(以下内容增加到 CMakeLists.txt 的末尾):

# 拷贝资源文件夹 res 到编译输出文件夹
add_custom_command(
		TARGET Job02 POST_BUILD
		COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different
			"${CMAKE_CURRENT_SOURCE_DIR}/res"
			"${CMAKE_CURRENT_BINARY_DIR}/res"
)

然后点 CLion 的菜单项:文件 / 重新加载 CMake 项目,使前述修改生效。

这样调整后,项目的文件结构会变为:

D:\Work\Job02\
	├ .idea\  <folder>
	├ cmake-build-debug\  <folder>
	│	├ Job02.exe					// 编译后的可执行文件
	│	└ res\  <folder>			// 资源文件夹(自动复制的)
	│		└ hero.png				// 待加载的图片(自动复制的)
	├ res\  <folder>				// 资源文件夹
	│	└ hero.png					// 待加载的图片
	├ CMakeLists.txt				// 编译配置文件
	└ main.cpp						// 代码文件

默认的当前路径是编译后的可执行文件 Job02.exe 的所在路径,即:D:\Work\Job02\cmake-build-debug

由于资源文件夹 res 已经自动拷贝到了 D:\Work\Job02\cmake-build-debug\res ,因此通过相对路径加载图片的代码这样写:

	loadimage(&img, "res\\hero.png");

那么图片的绝对路径为:“D:\Work\Job02\cmake-build-debug” + "res\hero.png" = D:\Work\Job02\cmake-build-debug\res\hero.png,可以找到图片。

▶ 在操作系统环境下,双击可执行文件 D:\Work\Job02\cmake-build-debug\Job02.exe ,可以通过相对路径找到图片。

▶ 发布应用时,可以这样组织应用的文件:

D:\App\Job02\
	├ Job02.exe				// 可执行文件
	└ res\  <folder>		// 资源文件夹
		└ hero.png			// 待加载的图片

使用相对路径的方案二

▶ 在 CLion 开发环境下,通过修改 CMakeLists.txt 调整生成的 Job02.exe 的路径,修改方法:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})		# 增加的内容,必须写在下面一行之前
add_executable(Job02 main.cpp)										# 原有的内容

然后点 CLion 的菜单项:文件 / 重新加载 CMake 项目,使前述修改生效。

这样调整后,项目的文件结构会变为:

D:\Work\Job02\
	├ .idea\  <folder>
	├ cmake-build-debug\  <folder>
	├ res\  <folder>
	│	└ hero.png				// 待加载的图片
	├ CMakeLists.txt			// 编译配置文件
	├ Job02.exe					// 编译后的可执行文件
	└ main.cpp					// 代码文件

默认的当前路径是编译后的可执行文件 Job02.exe 的所在路径,即:D:\Work\Job02

因此,通过相对路径加载图片的代码这样写:

	loadimage(&img, "res\\hero.png");

那么图片的绝对路径为:“D:\Work\Job02” + "res\hero.png" = D:\Work\Job02\res\hero.png,可以找到图片。

▶ 在操作系统环境下,双击可执行文件 D:\Work\Job02\Job02.exe ,也可以通过相对路径找到图片。

▶ 发布应用时,可以这样组织应用的文件:

D:\App\Job02\
	├ Job02.exe				// 可执行文件
	└ res\  <folder>		// 资源文件夹
		└ hero.png			// 待加载的图片

使用相对路径的方案三

▶ 在 CLion 开发环境下,执行程序时的当前路径,就是编译后的可执行文件 Job02.exe 的所在路径,即:D:\Work\Job02\cmake-build-debug

通过相对路径加载图片的代码这样写( ..\ 表示上一级文件夹):

	loadimage(&img, "..\\res\\hero.png");

▶ 在操作系统环境下,双击可执行文件 D:\Work\Job02\cmake-build-debug\Job02exe ,那么此时的“当前路径”为 Job02.exe 所在路径,即 D:\Work\Job02\cmake-build-debug\ ,此时图片的绝对路径为 D:\Work\Job02\cmake-build-debug\..\res\hero.png ,即 D:\Work\Job02\res\hero.png ,可以找到图片。

▶ 发布应用时,可以这样组织应用的文件:

D:\App\Job02\
	├ bin\  <folder>				// 存放二进制文件的文件夹
	│	└ Job02.exe				// 编译后的可执行文件
	└ res\  <folder>
		└ hero.png				// 待加载的图片

使用相对路径的方案四(不推荐)

▶ 在 CLion 开发环境下,点击右上角的下拉菜单(通常显示为当前配置名称,如 Job02),选择“编辑配置...”。在“工作目录”一栏中,输入:$ProjectFileDir$

这个设置可以将“当前路径”设置为 $ProjectFileDir$(即项目的根文件夹 D:\Work\Job02),因此通过相对路径加载图片的代码这样写:

	loadimage(&img, "res\\hero.png");

那么图片的绝对路径为:“D:\Work\Job02” + "res\hero.png" = D:\Work\Job02\res\hero.png,可以找到图片。

▶ 在操作系统环境下,双击可执行文件 D:\Work\Job02\cmake-build-debug\Job02.exe 无法通过相对路径找到图片,需要手动将 D:\Work\Job02\res\ 复制到 D:\Work\Job02\cmake-build-debug\res\ 。

▶ 发布应用时,可以这样组织应用的文件:

D:\App\Job02\
	├ Job02.exe					// 可执行文件
	└ res\  <folder>			// 资源文件夹
		└ hero.png				// 待加载的图片

使用该方案请注意:设置“工作目录”为 $ProjectFileDir$ ,这个设置无法保存在项目路径下,导致你的项目文件夹分享给别人后,别人无法直接运行成功,必须同样进行一次手动设置才可以。

  1. 以上只是举例,实际使用时记得替换掉例子中对应的文件名。
  2. 以上只是列举了部分常用方案,不是只有这几种方案,实际中可以根据自己的需求进行调整。

添加评论