【问题标题】:How can I get the application path in C?如何在 C 中获取应用程序路径?
【发布时间】:2014-11-22 21:44:51
【问题描述】:

我正在使用 GTK 为我的运行 Linux 的 C 程序创建一个接口。

我正在使用这个函数来加载我的 XML 接口:

gtk_builder_add_from_file(builder, g_build_filename("myInterface.glade", NULL), &error);

只要我和我的编译文件在同一个目录中,它就可以工作。 但如果我在另一个目录中,假设是一个子目录,然后我执行它:../a.out,我的程序找不到该文件。

所以思路是先获取程序路径(“/home/.../program”),加上文件名得到绝对路径。

但我不知道如何获得程序路径。而且我不确定这是让它发挥作用的最佳主意。

有什么想法吗?谢谢!

【问题讨论】:

  • 您在哪个操作系统上需要这个?
  • 到目前为止的答案没有考虑在没有给出路径的情况下启动可执行文件但shell通过扫描PATH环境变量找到的情况。
  • 如果操作系统是 Linux,则相关:stackoverflow.com/q/606041/694576
  • libgen.h 中的 dirname() 允许我获取 argv[0] 的路径并将我的文件路径连接到它。这正是我所需要的。
  • 我有一些代码 here 试图这样做。

标签: c gtk filepath


【解决方案1】:

argv[0] 包含你运行程序的相对/完整路径。

只需扫描到最后一个“/”,这将是您当前位置的运行目录

'edit' 经过更多研究后,我发现了这个,它适用于所有情况:

#include<stdio.h>
#include <unistd.h>
#include <string.h>
#include <libgen.h>
int main()
{
  char path[500] = {0};
  int dest_len = 500;
  if (readlink ("/proc/self/exe", path, dest_len) != -1)
    {
        dirname (path);
        strcat  (path, "/");
        printf("path=%s\n", path);
    }
}

【讨论】:

  • argv[0] 包含调用程序的名称。您不能依赖其中的完整路径。
  • 这仍然在滥用参数向量并且作为问题的解决方案不可靠。 argv[0] 只是被调用的程序名:它可能包含一个相对路径,它可能包含一个完整路径,它可能根本不包含任何路径。
  • 您说得有道理,但在大多数情况下,这是一个很好的解决方案。我一直在使用它,所以如果有更好的解决方案,我很想知道。
【解决方案2】:

在您使用 GTK 的情况下,最好使用GResource 并将myInterface.glade 直接编译到您的程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2020-05-25
    • 2011-05-16
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多