C Linux/Makefile:创建一个二进制文件,它的执行就像它在一个特定的目录中一样

C Linux/Makefile:创建一个二进制文件,它的执行就像它在一个特定的目录中一样,c,linux,makefile,C,Linux,Makefile,我有以下文件夹结构: include/ src/ data/ binary-file makefile 我会像这样执行二进制文件:./binary文件 但现在我希望我的二进制文件在它自己的文件夹中,如下所示: bin/ <- binary-file is in here now include/ src/ data/ makefile 到 您的数据文件名必须是。/data/xml/file.xml“ 。/“是一个相对路径,表示“返回一个文件夹”“../../etc”意味着返回两个文件夹

我有以下文件夹结构:

include/
src/
data/
binary-file
makefile
我会像这样执行二进制文件:./binary文件

但现在我希望我的二进制文件在它自己的文件夹中,如下所示:

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


您的数据文件名必须是
。/data/xml/file.xml“


。/“
是一个相对路径,表示“返回一个文件夹”
“../../etc”
意味着返回两个文件夹。

您的数据文件名必须是
。/data/xml/file.xml”


。/“
是一个相对路径,表示“返回一个文件夹”
“../../etc”
意味着返回两个文件夹。

您的数据文件名必须是
。/data/xml/file.xml”


。/“
是一个相对路径,表示“返回一个文件夹”
“../../etc”
意味着返回两个文件夹。

您的数据文件名必须是
。/data/xml/file.xml”


。/“
是一个相对路径,表示“返回一个文件夹”<代码>“../../etc”意味着返回两个文件夹。

可能您问了一个错误的问题:构建系统与程序执行无关

然而,如果您想找到一个答案,如何使我的程序正确使用数据,这是相对于程序安装的位置,这里是一个答案

当执行程序
main
时,它将二进制路径作为第一个参数(索引
0
)。该路径可以是相对路径,也可以是绝对路径,但在任何情况下,它都允许您查找基本目录

这些也是有用的链接:

以下是如何使用第一个参数:

#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;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char datadir[PATH_MAX];
strncpy(datadir,argv[0],sizeof(datadir));
dirname(datadir);
strncat(datadir,“/../data”,sizeof(datadir));
printf(“数据目录:%s\n”,datadir);
返回0;
}
该计划假定以下部署:

ROOT <- Can be anywhere on file system
+--bin
|  +--- <- application is here...
+--data
   +--- <- Data files are located here...

ROOT您可能问了一个错误的问题:构建系统与程序执行无关

然而,如果您想找到一个答案,如何使我的程序正确使用数据,这是相对于程序安装的位置,这里是一个答案

当执行程序
main
时,它将二进制路径作为第一个参数(索引
0
)。该路径可以是相对路径,也可以是绝对路径,但在任何情况下,它都允许您查找基本目录

这些也是有用的链接:

以下是如何使用第一个参数:

#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;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char datadir[PATH_MAX];
strncpy(datadir,argv[0],sizeof(datadir));
dirname(datadir);
strncat(datadir,“/../data”,sizeof(datadir));
printf(“数据目录:%s\n”,datadir);
返回0;
}
该计划假定以下部署:

ROOT <- Can be anywhere on file system
+--bin
|  +--- <- application is here...
+--data
   +--- <- Data files are located here...

ROOT您可能问了一个错误的问题:构建系统与程序执行无关

然而,如果您想找到一个答案,如何使我的程序正确使用数据,这是相对于程序安装的位置,这里是一个答案

当执行程序
main
时,它将二进制路径作为第一个参数(索引
0
)。该路径可以是相对路径,也可以是绝对路径,但在任何情况下,它都允许您查找基本目录

这些也是有用的链接:

以下是如何使用第一个参数:

#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;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char datadir[PATH_MAX];
strncpy(datadir,argv[0],sizeof(datadir));
dirname(datadir);
strncat(datadir,“/../data”,sizeof(datadir));
printf(“数据目录:%s\n”,datadir);
返回0;
}
该计划假定以下部署:

ROOT <- Can be anywhere on file system
+--bin
|  +--- <- application is here...
+--data
   +--- <- Data files are located here...

ROOT您可能问了一个错误的问题:构建系统与程序执行无关

然而,如果您想找到一个答案,如何使我的程序正确使用数据,这是相对于程序安装的位置,这里是一个答案

当执行程序
main
时,它将二进制路径作为第一个参数(索引
0
)。该路径可以是相对路径,也可以是绝对路径,但在任何情况下,它都允许您查找基本目录

这些也是有用的链接:

以下是如何使用第一个参数:

#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;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char datadir[PATH_MAX];
strncpy(datadir,argv[0],sizeof(datadir));
dirname(datadir);
strncat(datadir,“/../data”,sizeof(datadir));
printf(“数据目录:%s\n”,datadir);
返回0;
}
该计划假定以下部署:

ROOT <- Can be anywhere on file system
+--bin
|  +--- <- application is here...
+--data
   +--- <- Data files are located here...

ROOTOK,基于您最近的commnet


@thurizas我的DDIR中有一些二进制文件使用的数据(“data/xml/file.xml”)。当我从主文件夹:/bin/binary文件执行二进制文件时,一切正常。但是当我从/bin/文件夹执行二进制文件时:./binary文件无法加载“data/xml/file.xml”

  • 硬编码数据文件的绝对路径(例如/home/brandon/projects/data/xml/file.xml……假设是*nix类型的文件系统)。显然,好处是,无论可执行文件位于何处,它都可以找到数据文件。不利的一面是,如果你移动二进制文件,它将停止工作

  • 添加命令行选项以设置数据路径。例如,假设您选择应用程序数据文件的默认位置为
    /usr/share/brandon/myapp/data
    ,您可以将其硬编码到应用程序中。现在允许用户使用命令行参数来调整文件的位置。你的逻辑是如果com