You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置CMake构建的C++程序在其bin目录读写文件?

问题分析与解决方案

根本原因

当你在Engine目录下执行./example/bin/example时,程序的当前工作目录(CWD)是Engine/,而非可执行文件所在的Engine/example/bin/。C++中使用相对路径创建/读取文件时,默认基于当前工作目录,所以文件会生成在Engine/下,这和CMake本身无关,是程序运行时的环境问题。

解决方案(无需修改C++代码)

1. 运行时手动切换工作目录

直接在命令行中先进入可执行文件所在目录再运行程序:

cd Engine/example/bin && ./example

或者用pushd/popd避免切换后需要手动返回原目录:

pushd Engine/example/bin && ./example && popd

2. 通过CMake配置自动运行(推荐)

在Engine/example/CMakeLists.txt中添加自定义运行目标,让CMake自动切换到可执行文件目录再运行程序:

# 添加自定义目标,用于运行example程序
add_custom_target(run_example
  COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" ./example
  DEPENDS example
  COMMENT "Starting example application..."
)

配置完成后,你可以直接在Engine目录下执行:

make run_example

CMake会自动编译(如果需要)并切换到example/bin/目录运行程序,此时文件会生成在Engine/example/bin/下。

额外建议(可选,需修改代码)

如果希望程序无论在哪个目录运行,都默认使用可执行文件所在目录作为文件操作的基准,可以用C++17的std::filesystem库修改工作目录(仅修改一次main函数即可):

#include "Engine.hxx"
#include <fstream>
#include <filesystem>

namespace fs = std::filesystem;

int main(int argc, char* argv[]) {
    // 获取可执行文件的绝对路径并切换工作目录
    fs::path exe_path = fs::canonical(argv[0]);
    fs::current_path(exe_path.parent_path());

    Engine::SaveGame();
    std::ofstream output_file("test.txt");
    output_file << "line 1\nline 2\n";
    return 0;
}

这个方法不依赖运行时的工作目录,更适合发布版本的程序。


内容的提问来源于stack exchange,提问作者Markenburg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:57:43