Linux Makefile自动生成--config.h

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-1 15:53   50   0

原始出处: http://blog.csdn.net/spch2008/article/details/12510805


config.h主要用于代码移植,产生可移植代码。

有些函数只适用于特定的系统,并不通用,如gettimeofday。只能在特定的系统上使用,这样就不能移植了。

可以在可以使用的系统上使用gettimeofday,而不能使用的系统上使用另一种方式。

1. 代码如下:

  1. #include <stdio.h>
  2. #include <sys/time.h>
  3. #include <time.h>
  4. #include "config.h"
  5. double get_epoch()
  6. {
  7. double sec;
  8. #ifdef HAVE_GETTIMEOFDAY
  9. struct timeval tv;
  10. gettimeofday(&tv, NULL);
  11. sec = tv.tv_sec;
  12. sec += tv.tv_usec / 1000000.0;
  13. #else
  14. sec = time(NULL);
  15. #endif
  16. return sec;
  17. }
  18. int main(int argc, char* argv[])
  19. {
  20. printf("%f\n", get_epoch());
  21. return 0;
  22. }
上述config.h为生成的文件。通过#ifdef来采用某些代码。

2. autoscan

configure.scan内容如下:

  1. # -*- Autoconf -*-
  2. # Process this file with autoconf to produce a configure script.
  3. AC_PREREQ([2.68])
  4. AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
  5. AC_CONFIG_SRCDIR([hello.c])
  6. AC_CONFIG_HEADERS([config.h])
  7. # Checks for programs.
  8. AC_PROG_CC
  9. # Checks for libraries.
  10. # Checks for header files.
  11. AC_CHECK_HEADERS([sys/time.h])
  12. # Checks for typedefs, structures, and compiler characteristics.
  13. # Checks for library functions.
  14. AC_CHECK_FUNCS([gettimeofday])
  15. AC_CONFIG_FILES([Makefile])
  16. AC_OUTPUT
可见,增多了AC_CHECK_HEADERS与AC_CHECK_FUNCS宏,用于检测系统是否支持该头文件与函数。不要忘记增加

AM_INIT_AUTOMAKE宏,修改如下:

  1. AC_PREREQ([2.68])
  2. AC_INIT([main], [1.0], [BUG-REPORT-ADDRESS])
  3. AC_CONFIG_SRCDIR([hello.c])
  4. AC_CONFIG_HEADERS([config.h])
  5. AM_INIT_AUTOMAKE(hello, 1.0)
  6. # Checks for programs.
  7. AC_PROG_CC
  8. # Checks for libraries.
  9. # Checks for header files.
  10. AC_CHECK_HEADERS([sys/time.h])
  11. # Checks for typedefs, structures, and compiler characteristics.
  12. # Checks for library functions.
  13. AC_CHECK_FUNCS([gettimeofday])
  14. AC_CONFIG_FILES([Makefile])
  15. AC_OUTPUT


3. autoheader

autoheader后形成config.h.in模板,而config.status根据此模板生成config.h。config.h.in部分内容如下:

  1. /* Define to 1 if you have the `gettimeofday' function. */
  2. #undef HAVE_GETTIMEOFDAY
  3. /* Define to 1 if you have the <inttypes.h> header file. */
  4. #undef HAVE_INTTYPES_H
4. configure

config.h部分内容如下:

  1. #define HAVE_GETTIMEOFDAY 1
  2. /* Define to 1 if you have the <inttypes.h> header file. */
  3. #define HAVE_INTTYPES_H 1
5. 运行

  1. root@nova-controller:/home/spch2008/AutoMake# ./hello
  2. 1381306762.538480

注意:源文件要引入头文件config.h。这样,代码具有了可移植性。在生成Makefile前,检测系统环境,形成config.h头文件。


参考:http://www.lugod.org/presentations/autotools/presentation/autotools.pdf


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP