我正在尝试将我的应用程序从手动构建迁移到autoconf,到目前为止,它的运行情况非常好。但是我有一个静态库,我不知道该如何集成。该库将不在通常的库位置中-二进制文件(.a文件)和标头(.h文件)的位置将作为configure参数给出。 (值得注意的是,即使我将.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的configure参数,所需文件的名称为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()从configure.ac获取myprog_LDADD,所以最终的解决方案如下所示:

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)])

最佳答案

您可以在configure.ac中设置位置:

LOCATION=/home/john/mystuff
AC_SUBST(LOCATION)


AC_SUBST在所有$LOCATION中定义变量Makefile.am,并用@LOCATION@的内容替换所有出现的$LOCATION。因此,在您的Makefile.am中,您可以

myprog_CPPFLAGS="-I$LOCATION"
myprog_LDADD="$LOCATION/helper.a"


PS。之所以需要直接引用该库,是因为-l在系统库目录中寻找一个正确命名的库(例如libhelper.a)。但是,由于静态库和目标文件之间并没有太大的区别,因此无需使用-l神奇地引用它。您可以像现在一样将其编译到程序中。

关于autotools - Autoconf-包括一个静态库(新手),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2751541/

10-13 07:05