【问题标题】:What happens to the original .h file when using autotools?使用 autotools 时原始 .h 文件会发生什么情况?
【发布时间】:2019-03-24 19:18:33
【问题描述】:

我正在用 C 创建一个 shell。我创建的 .tar.gz 文件运行良好。但是,当我解压缩此文件时,我用于生成所述文件的原始头文件已更改为包含 autotools 使用的代码。有没有办法保留原始 .h 文件?

作为参考,这是我的 configure.ac:

AC_INIT([program_name], 1.0)  
AM_INIT_AUTOMAKE  
AC_PROG_CC  
AC_CONFIG_HEADERS([shell.h])  
AC_CONFIG_FILES(Makefile)  
AC_OUTPUT

Makefile.am 程序是:

bin_PROGRAMS = shell  
shell_SOURCES = main.c functions.c

我希望当我 cat shell.h 时,我会看到我制作的原始 #include 和 #define 。然而,它只有典型的 autotools #defines 关于包和版本号。

对此的任何帮助以及解释此处实际发生的情况将不胜感激,因此我不再这样做了。

【问题讨论】:

    标签: c header-files autotools


    【解决方案1】:

    AC_CONFIG_HEADERS (documentation) 输出一个 Autoconf 生成的头文件,其中包含有关包和用于编译它的环境的信息。

    通常这个文件叫做config.h,但你似乎把它叫做shell.h,它覆盖了你手动创建的另一个shell.h文件,我猜?

    如果是这种情况,解决方案是在 AC_CONFIG_HEADERS 中使用不同的名称。

    【讨论】:

    • ... 或者只是省略 AC_CONFIG_HEADERS。听起来 OP 可能对它的用途有完全错误的想法。
    【解决方案2】:

    正如@ptomato 已经观察到的那样,AC_CONFIG_HEADERS 用于请求configure 脚本在运行时为您创建一个头文件,其中定义了传达它收集的各种信息的宏,例如各种测试。宏参数指定此生成的文件应具有的名称。这是在命令行上传递给编译命令的所有信息的替代方法。它与命名源中提供的头文件无关,它肯定会导致任何此类头被替换。如果您的来源没有#include指定的标头,它也是无用的。

    不清楚是否需要这样的配置头,但如果shell.h 是您提供的头,并且您不希望configure 覆盖它,则不要将其名称指定为AC_CONFIG_HEADERS。你可能完全不用AC_CONFIG_HEADERS,虽然我个人喜欢它,因为使用它可以使最终的make 输出更容易阅读。如果您继续使用它,那么您需要选择一个不同的名称(例如传统的config.h),并且您需要在所有您的C 源代码#include 之前拥有该标头,然后再执行其他操作.

    若要通知 Automake 在最终未安装的源中提供的标头,只需将其列在至少一个目标的 _SOURCES 中即可。 Automake 知道不要尝试编译头文件,但将它们列在您的源代码中将确保它们被打包到通过make dist 生成的分发 tarball 中。还有其他选择,例如在EXTRA_DIST 中列出此类标头,但它们不那么传统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多