【问题标题】:Loading images relative to the binary加载相对于二进制文件的图像
【发布时间】:2012-07-02 23:28:30
【问题描述】:

我正在尝试将一些图像加载到一个非常基本的基于 C++/SDL 的程序中。使用SDL_LoadBMP 加载图像。我有图像加载,一切似乎都很完美。我的问题是图像是相对于我调用程序的位置加载的。

所以我有一个类似这样的目录结构。

project/
    src/
        source.cpp
    assets/
        image.bmp
    bin/
        program

当我从项目目录 (./bin/program) 执行程序时,它必须使用 assets/image.bmp 的路径来加载图像。有什么方法可以使用../assets/image.bmp 的相对路径,以便可以从任何地方执行程序?

我想我需要一些东西来提供程序的绝对路径,然后我可以将我的路径附加到。

【问题讨论】:

    标签: c++ sdl


    【解决方案1】:

    在 Linux 上,/proc/self/exe 是指向当前进程可执行文件的符号链接。所以你可以使用readlink 来找到它的路径。从那里您可以使用通常的路径操作来查找您的资源。也许您应该满足程序可执行文件再次成为二进制文件所在位置的符号链接的情况,即只要当前路径是符号链接,就进行更多的重新链接。

    曾经有一个关于finding current executable's path without /proc/self/exe 的问题也询问了便携界面,但在接受的答案中没有给出满足所有需求的单一解决方案。

    【讨论】:

    • 哇,没想到会这么难。那么像../path./path 这样的简单相对路径不行吗?我想我将不得不构建或找到一个可以在大多数地方工作的好功能。我的目标是 Linux,但我希望以后可以选择交叉编译。
    • 那么basename 呢?有什么理由不应该使用它? stackoverflow.com/a/1019557/455137
    • 相对路径总是相对于当前工作目录,这可能与您的二进制文件所在的目录完全无关。如果您主要针对 Linux,另请阅读 section 1.14 of the Unix Programming Frequently Asked Questions。它建议不要使用二进制相对路径。
    • basename(path) 基本上返回最后一次出现'/' 之后的path 部分。所以你需要一个开始的路径,即使那样你可能对dirnamebasename 更感兴趣。两者都属于我在回答中提到的“常规路径操纵”类别。
    【解决方案2】:

    在 Windows 中:

    1. GetModuleFileName(NULL, ... 为您提供二进制文件的完整路径
    2. PathRemoveFileSpec(... 只留下你的目录
    3. PathCombine(..., _T("..\\..\\image.bmp")) 上面第 2 项的结果为您提供完全合格的图像路径

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 2021-01-13
      • 2015-04-17
      • 2014-04-19
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多