如何配置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
相关产品推荐
相关产品推荐

