从二进制文件相对路径(Relative paths from binary file)

2019-10-21 22:24发布

我有以下文件夹结构:

bin/ <-binary-file is in here
include/
src/
data/
Makefile

在我的代码,我用我的数据相对路径。 因此, “../data/xml/xmlFile.xml”。 这是好的,如果我是执行从斌/文件夹中的二进制文件:

brandonto@computer:~/PATH-TO-PROJECT/bin$ ./binary-file 
argv[0] = ./binary-file
dirname(argv[0]) = .

但如果我是从主文件夹(或任何其他文件夹,不是的bin /文件夹)执行二进制:

brandonto@computer:~/PATH-TO-PROJECT$ bin/binary-file 
argv[0] = bin/binary-file
dirname(argv[0]) = bin

该XML文件将不会被发现,因为“../data”现在会从主文件夹(或任何文件夹,您正在执行的程序时)转到上一级目录。

我怎么可能让这个二进制文件可以从我的系统上的任何目录下执行?

为了使问题更加清楚一点:

brandonto@brandonto-Aspire-S3-391:~/cpp-workspace/sdl-projects/sdl-space-shooter/bin$ ~/cpp-workspace/sdl-projects/sdl-space-shooter/bin/SpaceShooter 
argv[0] = /home/brandonto/cpp-workspace/sdl-projects/sdl-space-shooter/bin/SpaceShooter
dirname(argv[0]) = /home/brandonto/cpp-workspace/sdl-projects/sdl-space-shooter/bin

brandonto@brandonto-Aspire-S3-391:~/cpp-workspace/sdl-projects/sdl-space-shooter/bin$ cd ..
brandonto@brandonto-Aspire-S3-391:~/cpp-workspace/sdl-projects/sdl-space-shooter$ ~/cpp-workspace/sdl-projects/sdl-space-shooter/bin/SpaceShooter 
argv[0] = /home/brandonto/cpp-workspace/sdl-projects/sdl-space-shooter/bin/SpaceShooter
dirname(argv[0]) = /home/brandonto/cpp-workspace/sdl-projects/sdl-space-shooter/bin
Unable to load image ../data/graphics/background/darkPurple.png! SDL_image Error: Couldn't open ../data/graphics/background/darkPurple.png
Unable to load image ../data/graphics/sprites/meteorBrown_big1.png! SDL_image Error: Couldn't open ../data/graphics/sprites/meteorBrown_big1.png

在这里,我从斌/文件夹内从主文件夹内执行的二进制文件一次,然后一次。 二进制跑到离斌/文件夹内的罚款,但不能从主文件夹中找到的.png文件的相对路径。

Answer 1:

也许你问一个错误的问题:构建系统无关与程序的执行。

但是,如果你找一个答案,如何让我的程序正确地使用数据,即相对于位于程序的安装,比这里是一个答案。

当你的程序main被执行,它就会二进制路径作为第一个参数(索引0 )。 这路径可以是相对或绝对的,但在任何情况下,它可以让你找到的基本目录。

这也是有用的链接:

  • 如何找到在C可执行文件的位置?
  • 查找当前可执行文件的路径没有的/ proc /自/ EXE

在这里您如何使用第一个参数:

#include <linux/limits.h>
#include <stdio.h>
#include <string.h>
#include <libgen.h>

int main(int argc, char *argv[])
{
  char datadir[PATH_MAX];
  strncpy(datadir, argv[0], sizeof(datadir));
  dirname(datadir);
  strncat(datadir, "/../data", sizeof(datadir));

  printf("Data dir: %s\n", datadir);

  return 0;
}


Answer 2:

我相信你可以使用GETPID命令找到你的进程ID(PID)和执行功能解压的目录类似的方式这个问题上提出的Ubuntu。



Answer 3:

我会以某种方式(组织)与其中可执行文件驻留的bin目录相关的数据。

然后,在运行程序时,如果提供一个完整的路径,然后你可以找到数据目录(通过检查ARG [0]说明)。 如果提供的是相对路径,然后搜索搜索路径顺序,直到找到可执行文件,然后你可以找到,因此数据目录。

没有的PID需要。 (我认为这是Python的寻找它的道路,或至少它是如何来做到这一点。)



Answer 4:

我通常用程序的设置解决这个问题。 在过去的好时光我会在这些设置.ini这将伴随着可执行文件。 一些设置是从程序中进行配置,以及所有可以用文本编辑器进行编辑。 如果文件丢失,或者任何设置缺失,他们将被默认创建。

该计划的数据的位置,我会用它的完整的绝对路径名。 例如,它可能是

Datapath = D:\os50k

并计划再追加单个文件名的路径是必要的。

这些天在Windows系统注册表被用于此目的。 但是你的问题被标记Linux它在不同的地方,包括程序目录存储设置。

这个问题 ,并且这个问题更全面地描述过程。



文章来源: Relative paths from binary file