Autoconf——包括静态库(新手)

2024-01-07

我正在尝试将我的应用程序从手动构建迁移到 autoconf,到目前为止,它运行得很好。但我有一个静态库,我不知道如何集成。该库不会位于通常的库位置 - 二进制文件(.a 文件)和头文件(.h 文件)的位置将作为配置参数给出。 (值得注意的是,即使我将 .a 文件移动到 /usr/lib 或我能想到的其他任何地方,它仍然无法工作。)它也不是传统上命名的(它不是以“lib”或“l”开头) ”)。

手动编译正在处理这些(目录不可预测 - 这只是一个示例):

gcc ...  -I/home/john/mystuff  /home/john/mystuff/helper.a

(呃,我实际上不明白为什么直接引用 .a 文件,而不是用 -L 或其他任何东西。是的,我对构建 C 程序的理解不成熟。)

因此,在我的configure.ac中,我可以使用相关的配置参数来使用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)])

您可以将位置设置为configure.ac:

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

AC_SUBST定义变量$LOCATION在你所有的Makefile.ams 并且还替换所有出现的@LOCATION@与内容$LOCATION。那么在你的Makefile.am你可以做

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Autoconf——包括静态库(新手) 的相关文章

随机推荐

  • 使用 java processbuilder 运行 bat 文件

    我正在尝试使用 java 进程生成器执行 bat 文件 但它不会启动该进程 请告诉我我在这里做错了什么 当我用 file sh 替换 file bat 时 这段代码在 Linux 环境下工作得很好 final ArrayList
  • Python 随机列表理解

    我有一个类似于以下内容的列表 1 2 1 4 5 2 3 2 4 5 3 1 4 2 我想从此列表中创建 x 个随机元素的列表 其中所选元素都不相同 困难的部分是我想通过使用列表理解来做到这一点 如果 x 3 可能的结果是 1 2 3 2
  • Rails 模型回调(创建/更新后)attribute_was 不起作用

    我正在将 Rails 5 1 应用程序迁移到 Rails 5 2 1 在我的模型中 我在创建或更新模型后使用回调来创建活动日志 很遗憾todo name and todo name was始终相同 当前值 这适用于每个属性和每个模型 还ch
  • 如何为 JMenu 子菜单设置加速器?

    我有一个用户请求将加速器添加到子菜单 JMenu 这将允许用户按下快捷键并使相应的子菜单 折叠 显示其包含的菜单项 我不记得每个人都见过这样的东西 无论是在 Java 还是任何其他语言中 我们的应用程序是使用 Swing 用 Ja va 编
  • 了解 TypeError:获得关键字参数的多个值

    我尝试了不同的方法来使用 args 调用该方法 下面是我的代码片段 def total name args if args print s has total money of Rs d name sum args else print s
  • 如何使用 Linq 的聚合函数 C# 添加到列表

    我有一个类型的对象集合 我想将其转换为不同类型 这可以使用 foreach 轻松完成 但我想弄清楚如何使用 Linq 的聚合函数来完成此操作 问题是所有聚合示例都使用行字符串或 int 类型 它们支持 运算符 我希望累加器类型是一个列表 它
  • 如何从 Java 向 sudo 提供 root 密码?

    我正在尝试编写一个小型 Java 应用程序来覆盖我的 etc resolv conf文件 我使用的是 Ubuntu 12 04 为此 我需要提供我的root密码 myUser myMachine sudo vim etc resolv co
  • Android:如何测量ListView的总高度[重复]

    这个问题在这里已经有答案了 我需要测量 ListView 的总高度 但似乎我不断得到错误的值 我正在使用这段代码 public static void setListViewHeightBasedOnChildren ListView li
  • 如何配置 karma-runner(也称为睾丸)与closure-library 一起使用

    我正在尝试将 karma runner 与 mocha 测试框架结合使用来测试使用closure library 和 angularjs 构建的应用程序 我总是得到namespace Application is not defined 提
  • 如何将动画视图捕获为视频

    我正在使用反应本机图像来显示网络上某些网址的一些图像 现在 根据某些条件 我以不同的时间间隔更新图像网址 我想将整个过渡捕获到视频文件中 但是 我找不到合适的 android API 用于本机端 或react native 包来实现这一点
  • 如何测量函数运行的时间?

    我想查看一个函数运行了多长时间 所以我在表单上添加了一个计时器对象 并得到了以下代码 private int counter 0 Inside button click I have timer new Timer timer Tick n
  • AWS S3 ACL 公共读写:安全问题

    我想要一些关于 AWS S3 ACL 公共读写的解释 来自docs http docs aws amazon com AmazonS3 latest dev acl overview html 所有者获得 FULL CONTROL AllU
  • R 图 - 具有颜色渐变的正态曲线

    How can I make curves with a color gradient in R Take a look at this flame 它应该看起来像那样 我尝试制作一条法线曲线 然后制作另一条法线曲线 但从技术上讲 你无法用
  • 等待文件上传

    我遇到了困难 我正在尝试使用 WatiN 上传文件 我可以加载上传框 但它很快就消失了 目前我的代码的最后一行是 ie FileUpload Find ById profile file Click 它加载对话框以选择图片但消失 是否可以自
  • Fiware-Orion:订阅所有实体

    在 Orion 1 4 0 中我使用以下 JSON 来订阅对于所有实体 description Update average rating subject entities idPattern type condition attrs no
  • 在 notepad.exe 中挂钩 CreateFile 不会捕获 API 调用

    我的最终目标是通过在 kernel32 dll 中挂钩文件 api 来跟踪 explorer exe 完成的文件操作 但是我尚未实现该操作 explorer exe 没有调用 API 或者我这边出了问题 为了弄清楚发生了什么 我设置了一个目
  • 有趣的错误?在操作系统中预装了 Ruby (1.8.7)

    2 2 gt 4 2 63 gt 9223372036854775808 2 63 2 63 gt 18446744073709551616 64以及它返回后的一切0 2 64 gt 0 2 65 gt 0 2 100 gt 0 2 100
  • 删除 List 中的替代元素

    删除替换 奇数索引或偶数索引 元素的最有效方法是什么List
  • 如何在 openssl 1.0.1 中加载 CRL 路径?

    自从我更新到 openssl 1 0 1 以来 我的应用程序中的吊销检查功能已损坏 在 apps verfiy c 的帮助下 我发现 CRL 文件的加载发生了变化 到目前为止我已经完成了以下操作 X509 LOOKUP lookup con
  • Autoconf——包括静态库(新手)

    我正在尝试将我的应用程序从手动构建迁移到 autoconf 到目前为止 它运行得很好 但我有一个静态库 我不知道如何集成 该库不会位于通常的库位置 二进制文件 a 文件 和头文件 h 文件 的位置将作为配置参数给出 值得注意的是 即使我将