Autoconf - 包括一个静态库(新手)

时间:2010-05-01 21:09:08

标签: autotools autoconf

我正在尝试将我的应用程序从手动构建迁移到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)])

1 个答案:

答案 0 :(得分:9)

您可以在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神奇地引用它;你可以把它编译成你现在正在做的程序。