如何在 C 语言中获取应用程序路径?

3

我正在使用GTK为我的Linux C程序创建界面。

我正在使用以下函数加载我的XML界面:

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

只要我在与编译文件相同的目录中,它就可以工作。但是如果我在另一个目录中,比如子目录,并执行它:../a.out,我的程序找不到该文件。
因此,思路是首先获取程序路径(“/home/.../program”),然后添加文件名以获取绝对路径。
但是我不知道如何获取程序路径。而且我不确定这是否是使其正常工作的最佳方法。
有什么建议吗?谢谢!

你需要在哪个操作系统上使用这个? - alk
2
到目前为止,答案并没有考虑到这样一种情况:当可执行文件在启动时没有给出路径,但是通过扫描“PATH”环境变量被 shell 找到。 - alk
2
如果操作系统是Linux:https://dev59.com/questions/UXRB5IYBdhLWcg3wgHWr - alk
libgen.h 中的 dirname() 函数允许我获取 argv[0] 的路径并将我的文件路径连接到它。这正是我所需要的。 - Adrien Neveu
我有一些代码在这里,试图做到这一点。 - luser droog
显示剩余2条评论
2个回答

2

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

只需扫描到最后一个'/',这将是从当前位置开始的运行目录。

经过更多研究后,我发现以下方法适用于所有情况:

#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);
    }
}

4
argv[0] 包含程序被调用时的名称。你不能依赖其中包含完整路径的情况。 - MicroVirus
这仍然滥用参数向量,并且不可靠作为问题的解决方案。 argv [0]只是被调用的程序名称:它可能包括相对路径,也可能包括完整路径,也可能根本不包括任何路径。 - Jussi Kukkonen
你说得有道理,但对于大多数情况来说,这是一个不错的解决方案。我一直都在使用它,如果有更好的解决方案,我很乐意了解。 - Shlomi Agiv

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接