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

时间:2015-02-16 18:44:03

标签: c linux makefile

我有以下文件夹结构:

include/
src/
data/
binary-file
makefile

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

但是现在我想要我的二进制文件自己的文件夹如下:

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

当我从主文件夹执行它时,一切都很顺利:bin / binary-file

但是如果我在主文件夹以外的其他文件夹中,程序将会出现问题,并且无法找到#include的路径。例如,如果我在bin /文件夹中,如果我按如下方式执行它,程序就会出现错误:./ binary-file

我的问题是:如何从系统的任何位置告诉我的makefile或二进制文件是否像在主文件夹中一样执行?

在我的makefile中,我改变的是:

$(CC) $(CFLAGS) -I$(IDIR) -I$(BDIR) -I$(DDIR) -o $(PROG) $^ $(LFLAGS)

$(CC) $(CFLAGS) -I$(IDIR) -I$(BDIR) -I$(DDIR) -o $(BDIR)/$(PROG) $^ $(LFLAGS)

3 个答案:

答案 0 :(得分:1)

您的数据文件名必须为"../data/xml/file.xml"

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

答案 1 :(得分:1)

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

但是,如果你寻找答案,如何使我的程序正确使用数据,这是相对于程序安装而言,这是一个答案。

当你编写main程序时,它会将二进制路径作为第一个参数(索引0)。该路径可以是相对路径或绝对路径,但无论如何它都允许您找到 base 目录。

这些也是有用的链接:

这里你可以使用第一个参数:

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

该程序采用以下部署:

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

答案 2 :(得分:1)

好的,基于您最近的通讯

  

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

  1. 硬编码数据文件的绝对路径(例如/home/brandonto/projects/data/xml/file.xml ....假设有一个* nix类型的文件系统)。显而易见的是,无论您在哪里找到可执行文件,它都可以找到数据文件。不好的一面是,如果您移动二进制文件,它将停止工作。

  2. 添加命令行选项以设置数据路径。例如,假设您选择应用程序数据文件的默认位置为/usr/share/brandonto/myapp/data,您可以将其硬编码到应用程序中。现在允许用户使用命令行参数来调整找到文件的位置。如果给出了命令行参数,那么你的逻辑就是使用它,否则使用默认位置。好的一面是,您可以从任何地方执行,用户可以根据自己的喜好移动内容,如果需要,您可以拥有两组数据文件(例如一个用于测试,一个用于生产)。缺点是,你的程序变得有点复杂,如果使用确实将数据文件移动到某个不寻常的地方,那么每次启动应用程序时都必须输入更多。所以例如;

    ./myapp   -- would use the default location for the data files
    ./myapp -f <somepath> -- would use the files in <somepath> over ridding the default
    
  3. 还有一些其他选项,比如配置文件(让我们回到与你最初的问题非常相似的东西:))