gpt4 book ai didi

c - 如何使用 autotools 设置项目,以便生成的可执行文件可以看到所需的二进制文件?

转载 作者:太空宇宙 更新时间:2023-11-04 02:44:10 25 4
gpt4 key购买 nike

我正在使用 c 来针对 allegro 构建一些代码并使用autotools 来处理构建系统。问题是代码正在尝试拉入位图,我不确定如何正确处理使用自动工具。

我的项目布局:

allegro-learning/
Makefile.am
README
configure.ac
src/
stargate.c
stargate.bmp

stargate.c 中的代码通过以下方式拉入位图:

stargate = load_bitmap("stargate.bmp", NULL);

allegro-learning/configure.ac 的内容:

AC_PREREQ([2.69])
AC_INIT([allegro-learning], [1.0], [itsjustme@gmail.com])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_CONFIG_SRCDIR([config.h.in])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
AM_PROG_CC_C_O
PKG_CHECK_MODULES([ALLEGRO], [allegro >= 4.2.3])
AC_CHECK_HEADERS([stdio.h])
AC_CONFIG_FILES([Makefile
src/Makefile])
AC_OUTPUT

allegro-learning/Makefile.am 的内容:

SUBDIRS = src
dist_doc_DATA = README

allegro-learning/src/Makefile.am 的内容:

bin_PROGRAMS = stargate

stargate_SOURCES = stargate.c
stargate_CFLAGS = $(ALLEGRO_CFLAGS)
stargate_LDFLAGS = $(ALLEGRO_LIBS)

当我使用 autotools 构建和安装时:

# autoreconf --install
# ./configure --prefix=$HOME/usr
# make
# make install

并运行生成的 stargate 可执行文件一切段错误。破解它用 GDB 打开显示失败在我在上面突出显示的行(来自 stargate.c)中,它拉入 stargate.bmp。

但是,当我只是去 allegro-learning/src 并构建直接不使用自动工具:

# cd allegro-learning/src
# gcc `pkg-config allegro --cflags --libs` -o stargate stargate.c

运行可执行文件工作正常。这让我相信我没有使用 autotools 正确设置项目来安装位图,以便可执行文件可以在安装后找到它们。

正确的做法是什么?

我咨询过Autotools并且看起来在将 autotools 与 java 一起使用时安装 jar 是一个类似的问题,您有 .jar 文件,这些文件也必须安装并且可供执行代码查看。但他的例子嵌入了一个更大的项目,这让我感到困惑。

我也看过 Data Files With Automake但我仍然不确定我应该如何修改我的项目,以便生成的可执行文件可以找到位图。事实上,我不确定 stargate.bmp 是否符合 autotools 宇宙中的“数据文件”。也许有一种完全不同的方法来处理这种情况?

有关如何处理此类情况的任何具体指导非常感谢。

最佳答案

在这里回答我自己的问题。在automake mailing lists上进行了一些互动之后我找到了我的问题的解决方案并进行了以下调整:

到 allegro-learning/src/Makefile.am:

stargatedir = $(datadir)/stargate
stargate_DATA = stargate.bmp
stargate_SOURCES = stargate.c
stargate_CFLAGS = $(ALLEGRO_CFLAGS) -DPKGDATADIR=\"$(stargatedir)\"
stargate_LDFLAGS = $(ALLEGRO_LIBS)

我向 stargate.c 添加了以下内容:

#include <stdio.h>

// for nice string concatenation:
#define Sasprintf(write_to, ...) { \
char *tmp_string_for_extend = (write_to); \
asprintf(&(write_to), __VA_ARGS__); \
free(tmp_string_for_extend); \
}

char* addImageBaseDir(char* filename) {
char *abspath = NULL;
Sasprintf(abspath, PKGDATADIR);
Sasprintf(abspath, "%s%s%s", abspath, "/", "stargate.bmp");
return abspath;
}

现在我替换原来的,

stargate = load_bitmap("stargate.bmp", NULL);

与,

stargate = load_bitmap(addImageBaseDir("stargate.bmp"), NULL)

并且使用 autotools 构建现在工作得很好。

关于c - 如何使用 autotools 设置项目,以便生成的可执行文件可以看到所需的二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29048580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com