游戏引擎中getcwd返回构建路径而非源码路径,Eclipse正常VS Code异常如何解决
路径差异原因
你当前获取路径的逻辑使用getcwd()读取的是进程当前工作目录(CWD),并非可执行文件本身的存储路径,两个IDE的默认启动配置不同导致路径差异:
- Eclipse默认将程序启动的工作目录设置为项目根目录(即
../GlistApp/),拼接后路径符合预期 - VS Code的C/C++插件默认将工作目录设置为可执行文件的输出目录(即
../GlistApp/build/),因此拼接后的资源路径多了一层build目录
修复方案
最优方案:修改引擎路径获取逻辑
将获取工作目录的逻辑替换为获取可执行文件自身的存储路径,完全不依赖IDE的启动配置,适配所有运行场景:
#include <string> #ifdef _WIN32 #include <windows.h> #elif __APPLE__ #include <mach-o/dyld.h> #elif __linux__ #include <unistd.h> #endif std::string gObject::exepath; gObject::gObject() { char temp[1024]; // 扩大缓冲区避免长路径截断 #ifdef _WIN32 GetModuleFileNameA(NULL, temp, sizeof(temp)); #elif __APPLE__ uint32_t pathSize = sizeof(temp); _NSGetExecutablePath(temp, &pathSize); #elif __linux__ ssize_t pathLen = readlink("/proc/self/exe", temp, sizeof(temp)-1); if (pathLen != -1) temp[pathLen] = '\0'; #endif // 截取可执行文件所在的目录路径,去掉文件名 std::string fullExePath = temp; size_t lastSplitPos = fullExePath.find_last_of("/\\"); exepath = fullExePath.substr(0, lastSplitPos) + "/"; // 统一替换反斜杠为正斜杠 for (int i = 0; i < exepath.size(); i++) { if (exepath[i] == '\\') { exepath[i] = '/'; } } // 开发阶段可执行文件在build目录时,加这行跳转到项目根目录,发布时注释或用编译宏控制 // exepath += "../"; // 也可通过编译宏自动适配开发/发布场景 // #ifdef DEVELOPMENT_BUILD // exepath += "../"; // #endif }
临时方案:修改VS Code启动配置
如果不想改动引擎代码,可直接调整VS Code的运行配置对齐Eclipse行为:打开项目下.vscode/launch.json文件,找到cwd配置项,将值修改为"${workspaceFolder}"即可。
内容的提问来源于stack exchange,提问作者guacamoleku
相关产品推荐
相关产品推荐

