我正在尝试将我的应用程序从手动构建迁移到 autoconf,到目前为止运行良好。但是我有一个静态库,我不知道如何集成。该库不会位于通常的库位置 - 二进制文件(.a 文件)和标头(.h 文件)的位置将作为配置参数给出。(值得注意的是,即使我将 .a 文件移动到 /usr/lib 或我能想到的任何其他位置,它仍然无法工作。)它也没有传统命名(它不以“lib”或“l ”)。
手动编译正在使用这些(目录不可预测 - 这只是一个示例):
gcc ... -I/home/john/mystuff /home/john/mystuff/helper.a
(呃,我实际上不明白为什么直接引用 .a 文件,而不是使用 -L 或其他任何东西。是的,我对构建 C 程序的理解半生不熟。)
因此,在我的 configure.ac 中,我可以使用相关的 configure 参数通过 AC_CHECK_HEADER 成功找到头文件(.h 文件)。在 AC_CHECK_HEADER 中,我将位置添加到 CPFLAGS 中,实际 C 代码中头文件的#include 很好地选择了它。
给定一个已放入 $location 的配置参数,并且所需文件的名称是 helper.h 和 helper.a (它们都在同一个目录中),这是目前有效的:
AC_CHECK_HEADER([$location/helper.h],
[AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h])
CFLAGS="$CFLAGS -I$location"])
我遇到困难的地方是获取链接的二进制文件(.a 文件)。无论我尝试什么,我总是会收到有关对该库的函数调用的未定义引用的错误。我很确定这是一个链接问题,因为我可以对 C 代码大惊小怪,并在对该库的函数调用中故意犯错误,这会产生较早的错误,表明函数原型已被加载并用于编译。
我尝试将包含 .a 文件的位置添加到 LDFLAGS,然后执行 AC_CHECK_LIB 但找不到。
也许我的语法是错误的,或者我错过了一些更基本的东西,这并不奇怪,因为我是一个新手并且并不真正知道我在做什么。
这是我尝试过的:
AC_CHECK_HEADER([$location/helper.h],
[AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h])
CFLAGS="$CFLAGS -I$location";
LDFLAGS="$LDFLAGS -L$location";
AC_CHECK_LIB(helper)])
没有骰子。AC_CHECK_LIB 正在寻找 -lhelper 我猜(或 libhelper?)所以我不确定这是否是一个问题,所以我也尝试了这个(省略 AC_CHECK_LIB 并直接在 LDFLAGS 中包含 .a),但没有运气:
AC_CHECK_HEADER([$location/helper.h],
[AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h])
CFLAGS="$CFLAGS -I$location";
LDFLAGS="$LDFLAGS -L$location/helper.a"])
为了模拟手动编译,我尝试删除 -L 但这无济于事:
AC_CHECK_HEADER([$location/helper.h],
[AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h])
CFLAGS="$CFLAGS -I$location";
LDFLAGS="$LDFLAGS $location/helper.a"])
我尝试了其他组合和排列,但我想我可能会遗漏一些更基本的东西......
================ 更新
我让它使用 _LDADD 使用 Makefile.am 中的 .a 文件的硬编码路径,如下所示:
myprog_LDADD=/home/john/mystuff/helper.a
但我无法预测 .a 文件的位置。出于某种原因,在 configure.ac 中定义 myprog_LDADD 不起作用(我希望它这样做,所以我可以使用我的动态位置变量),并且对 LDFLAGS、myprog_LDFLAGS、AM_LDFLAGS 的任何更改组合似乎都不起作用。
如果在 Makefile.am 中,我尝试使用在 configure.ac 中定义的变量位置,它就不起作用
myprog_LDADD=($location)helper.a
================ 更新
我想我明白了,但由于我不知道我在做什么,我真的很感激一些反馈。我使用 AC_SUBST() 让 myprog_LDADD 从 configure.ac 工作,所以最终的解决方案如下所示:
AC_CHECK_HEADER([$location/helper.h],
[AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h])
CFLAGS="$CFLAGS -I$location"
myprog_LDADD="$location/helper.a"
AC_SUBST(myprog_LDADD)])