【问题标题】:autotools for 2 programs用于 2 个程序的自动工具
【发布时间】:2010-01-15 04:45:52
【问题描述】:

我有一个程序 main.c,它在程序中的 header.h 的帮助下调用 header.c。我知道如何在 GCC 中编译它,但现在我想使用自动工具。我想知道Makefile.am中应该写什么来编译main.c?

例如,如果我有两个 c 文件 main.c 和 header.c,如下所示

main.c:-

#include<stdio.h>
#include"header.h"
int main(int argc, char* argv[])
{

   printf("\n Hello");
  function1();

   return 0;
}

我的 header.c 文件包含

#include<stdio.h>
void function1()
{
  printf("\n Hi");
}

所以我的 header.h 文件将包含

void function1();

那么在这种情况下应该在makefile.am和configure.ac中写什么

【问题讨论】:

    标签: c compilation header-files autotools


    【解决方案1】:

    这是您所描述情况所需的一个最小示例。

    您需要一个makefile.am,其中包含要构建的二进制文件的名称,以及用于构建它的源文件(您不必列出头文件,它们会被自动检测到):

    bin_PROGRAMS = example
    example_SOURCES = main.c header.c
    

    你需要一个configure.ac。在这里您设置程序的名称和版本号,使用 foreign 参数初始化 Automake,这样它就不会向您抱怨缺少 GNU 项目所需的文件,告诉它您需要一个 C 编译器,告诉它构建你的Makefile,最后告诉它输出之前配置的结果。

    AC_INIT([example], [1.0])
    AM_INIT_AUTOMAKE([foreign])
    AC_PROG_CC
    AC_CONFIG_FILES([Makefile])
    AC_OUTPUT
    

    如果您现有的程序有任何类型的库依赖项,您可以运行autoscan 来检测可能的依赖项。它会生成一个文件configure.scan,其中包含一个可用于帮助构建您的configure.ac 的模板;但如果你的程序很简单,你可以跳过这一步并使用上面的最小示例。

    现在运行autoreconf --install 复制一些必要的文件,并从上述配置文件构建Makefile.inconfigure。然后,运行./configure 来配置你的脚本,生成一个Makefile。最后,运行make 来构建您的程序。

    完成这些步骤后,您生成的Makefile 将检测到您的makefile.am 的更改并再次运行这些步骤,因此从现在开始,您应该能够只运行make 而无需再次完成所有这些步骤。

    有关详细信息,请参阅 AutomakeAutoconf 手册。

    【讨论】:

      【解决方案2】:

      一个最小的 Makefile.am:

      SHELL = /bin/sh
      
      prefix = /usr/local
      exec_prefix = @prefix@
      bindir = ${exec_prefix}/bin
      
      AM_CFLAGS = -I./
      
      bin_PROGRAMS = your_program_name
      
      niue_SOURCES = main.c
      
      
      install-exec-local:
          cp ./your_program_name ${bindir}
      
      uninstall-local:
          rm ${bindir}/your_program_name
      

      您可能还需要一个 configure.ac:

      # Process this file with autoconf to produce a configure script.
      
      AC_PREREQ(2.59)
      AC_INIT(your_program_name, 0.1, you@yourdomain.com)
      AM_INIT_AUTOMAKE
      AC_CONFIG_SRCDIR([main.c])
      AC_CONFIG_HEADER([config.h])
      
      # Checks for programs.
      AC_PROG_CC
      
      # Checks for additional libraries.
      # AC_CHECK_LIB([pthread], [pthread_create])
      
      # Checks for additional header files.
      # AC_CHECK_HEADERS([getopt.h])
      
      # Checks for typedefs, structures, and compiler characteristics.
      AC_HEADER_STDBOOL
      AC_C_CONST
      AC_TYPE_SIZE_T
      AC_HEADER_TIME
      AC_C_VOLATILE
      
      # Checks for library functions.
      AC_HEADER_STDC
      AC_FUNC_SELECT_ARGTYPES
      #AC_CHECK_FUNCS([getopt_long])
      
      AC_CONFIG_FILES([Makefile])
      AC_OUTPUT
      

      【讨论】:

        【解决方案3】:

        例如,如果我有两个 c 文件 main.c 和 header.c,如下所示

        main.c:-

        包括

        包括“header.h”

        int main(int argc, char* argv[]) {

        printf("\n 你好"); 函数1();

        返回 0; }

        我的 header.c 文件包含

        包括

        无效函数1() { printf("\n 你好"); }

        所以我的 header.h 文件将包含 无效函数1();

        那么在这种情况下应该在makefile.am和configure.ac中写什么

        【讨论】:

        • 嗨,吉纳尔。你似乎是新来的,所以我会给你一些关于如何使用这个网站的建议。像这样的澄清应该作为对您原始问题的编辑进行,而不是作为对您自己问题的回答。查看问题的左下角;您应该会看到一个小的“编辑”链接,您可以单击该链接,然后编辑您的问题以提供任何说明。此外,任何源代码都应缩进 4 个空格;这将导致它被格式化为源代码,而不是被解释为样式文本。您可以选择整个代码块,然后按101010 按钮将其缩进。
        • 我已经为你完成了编辑;有经验的用户可以编辑其他人的问题和答案以帮助解决此类问题。如果您认为您的问题没有得到充分回答,您也可以回复让回答过的人知道为什么他们的回答不够好​​或不适合您。我提供的答案应该适用于您在此处描述的确切情况(我什至使用示例项目对其进行了测试),因此如果您能告诉我哪个部分不适合您,它将帮助我为您提供更好的答案,或者我的答案不清楚的地方。
        猜你喜欢
        • 2020-06-10
        • 2011-01-13
        • 1970-01-01
        • 1970-01-01
        • 2019-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多