电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

autoconf手册(四)


发布日期:2024/4/21
 

对普通函数的检查

这些宏被用于寻找没有包括在特定函数测试宏中的函数如果函数可能出现在除了缺省C库以外的库中就要首先为这些库调用AC_CHECK_LIB如果你除了需要检查函数是否存在之外还要检查函数的行为你就不得不为此而编写你自己的测试(参见编写测试)

AC_CHECK_FUNC (function [actioniffound [ actionifnotfound]])

如果可以使用C函数function就运行shell命令actioniffound否则运行 actionifnotfound如果你只希望在函数可用的时候定义一个符号就考虑使用 AC_CHECK_FUNCS由于C++比C更加标准化即使在调用了AC_LANG_CPLUSPLUS 的时候本宏仍然用C的连接方式对函数进行检查(关于为测试选择语言的详情请参见 对语言的选择)

AC_CHECK_FUNCS (function [ actioniffound [ actionifnotfound]])

对于每个在以空格分隔的函数列表function中出现的函数如果可用就定义HAVE_function (全部大写)如果给出了actioniffound它就是在找到一个函数的时候执行的附加的shell代码你可以给出 `break以便在找到第一个匹配的时候跳出循环如果给出了actionifnotfound它就在找不到某个函数的时候执行

AC_REPLACE_FUNCS (function)

本宏的功能就类似于以将`functiono添加到输出变量LIBOBJS的shell 代码为参数actionifnotfound调用AC_CHECK_FUNCS你可以通过用 `#ifndef HAVE_function包围你为函数提供的替代版本的原型来声明函数如果系统含有该函数它可能在一个你应该引入的头文件中进行声明所以你不应该重新声明它以避免声明沖突

头文件

下列宏检查某些C头文件是否存在如果没有为你需要检查的头文件定义特定的宏而且你不需要检查它的任何特殊属性那么你就可以使用一个通用的头文件检查宏

对特定头文件的检查

这些宏检查特定的系统头文件它们是否存在以及在某些情况下它们是否定义了特定的符号

AC_DECL_SYS_SIGLIST

如果在系统头文件`signalh或者`unistdh中定义了变量sys_siglist就定义SYS_SIGLIST_DECLARED

AC_DIR_HEADER

类似于调用AC_HEADER_DIRENT和AC_FUNC_CLOSEDIR_VOID但为了指明找到了哪个头文件而定义了不同的一组C预处理器宏本宏和它定义的名字是过时的它定义的名字是

`direnth

DIRENT

`sys/ndirh

SYSNDIR

`sys/dirh

SYSDIR

`ndirh

NDIR

此外如果closedir不能返回一个有意义的值就定义VOID_CLOSEDIR

AC_HEADER_DIRENT

对下列头文件进行检查并且为第一个找到的头文件定义`DIR以及列出的C预处理器宏

`direnth

HAVE_DIRENT_H

`sys/ndirh

HAVE_SYS_NDIR_H

`sys/dirh

HAVE_SYS_DIR_H

`ndirh

HAVE_NDIR_H

源代码中的目录库声明应该以类似于下面的方式给出

#if HAVE_DIRENT_H

# include

# define NAMLEN(dirent) strlen((dirent)>d_name)

#else

# define dirent direct

# define NAMLEN(dirent) (dirent)>d_namlen

# if HAVE_SYS_NDIR_H

#include

# endif

# if HAVE_SYS_DIR_H

#include

# endif

# if HAVE_NDIR_H

#include

# endif

#endif

使用上述声明程序应该把变量定义成类型struct dirent而不是struct direct并且应该通过把指向struct direct的指针传递给宏NAMLEN来获得目录项的名称的长度

本宏还为SCO Xenix检查库`dir和`x

AC_HEADER_MAJOR

如果`sys/typesh没有定义majorminor和makedev但`sys/mkdevh定义了它们就定义MAJOR_IN_MKDEV否则如果`sys/sysmacrosh定义了它们就定义MAJOR_IN_SYSMACROS

AC_HEADER_STDC

如果含有标准C(ANSI C)头文件就定义STDC_HEADERS特别地本宏检查`stdlibh`stdargh`stringh和`floath如果系统含有这些头文件它可能也含有其他的标准C头文件本宏还检查`stringh是否定义了memchr (并据此对其他mem函数做出假定)`stdlibh是否定义了free(并据此对malloc和其他相关函数做出假定)以及`ctypeh宏是否按照标准C的要求而可以用于被设置了高位的字符

因为许多含有GCC的系统并不含有标准C头文件所以用STDC_HEADERS而不是__STDC__ 来决定系统是否含有服从标准(ANSIcompliant)的头文件(以及可能的C库函数)

在没有标准C头文件的系统上变种太多以至于可能没有简单的方式对你所使用的函数进行定义以使得它们与系统头文件声明的函数完全相同某些系统包含了ANSI和BSD函数的混合某些基本上是标准(ANSI)的但缺少`memmove有些系统在`stringh或者`stringsh中以宏的方式定义了BSD函数有些系统除了含有`stringh之外只含有BSD函数某些系统在`memoryh 中定义内存函数有些在`stringh中定义等等对于一个字符串函数和一个内存函数的检查可能就够了如果库含有这些函数的标准版那么它就可能含有其他大部分函数如果你在`configurein 中安放了如下代码

AC_HEADER_STDC

AC_CHECK_FUNCS(strchr memcpy)

那么在你的代码中你就可以像下面那样放置声明

#if STDC_HEADERS

# include

#else

# ifndef HAVE_STRCHR

#define strchr index

#define strrchr rindex

# endif

char *strchr () *strrchr ();

# ifndef HAVE_MEMCPY

#define memcpy(d s n) bcopy ((s) (d) (n))

#define memmove(d s n) bcopy ((s) (d) (n))

# endif

#endif

如果你使用没有等价的BSD版的函数诸如memchrmemsetstrtok 或者strspn那么仅仅使用宏就不够了你必须为每个函数提供一个实现以memchr为例一种仅仅在需要的时候(因为系统C库中的函数可能经过了手工优化)与你的实现协作的简单方式是把实现放入 `memchrc并且使用`AC_REPLACE_FUNCS(memchr)

AC_HEADER_SYS_WAIT

如果`sys/waith存在并且它和POSIX相兼容就定义HAVE_SYS_WAIT_H如果`sys/waith不存在或者如果它使用老式BSD union wait而不是 int来储存状态值就可能出现不兼容如果`sys/waith不与POSIX兼容那就不是引入该头文件而是按照它们的常见解释定义POSIX下面是一个例子

#include

#if HAVE_SYS_WAIT_H

# include

#endif

#ifndef WEXITSTATUS

# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> )

#endif

#ifndef WIFEXITED

# define WIFEXITED(stat_val) (((stat_val) & ) == )

#endif

AC_MEMORY_H

在`stringh如果没有定义memcpy memcmp等函数并且`memoryh 存在就定义NEED_MEMORY_H本宏已经过时可以用AC_CHECK_HEADERS(memoryh)来代替参见为AC_HEADER_STDC提供的例子

AC_UNISTD_H

如果系统含有`unistdh就定义HAVE_UNISTD_H本宏已经过时可以用 `AC_CHECK_HEADERS(unistdh)来代替

检查系统是否支持POSIX的方式是

#if HAVE_UNISTD_H

# include

# include

#endif

#ifdef _POSIX_VERSION

/* Code for POSIX systems*/

#endif

在POSIX系统中包含了`unistdh的时候定义_POSIX_VERSION如果系统中没有`unistdh那么该系统就一定不是POSIX系统但是有些非POSIX(nonPOSIX)系统也含有`unistdh

AC_USG

如果系统并不含有`stringshrindexbzero等头文件或函数就定义USG定义USG就隐含地表明了系统含有`stringhstrrchrmemset等头文件或函数

符号USG已经过时了作为本宏的替代参见为AC_HEADER_STDC提供的例子

对普通头文件的检查

这些宏被用于寻找没有包括在特定测试宏中的系统头文件如果你除了检查头文件是否存在之外还要检查它的内容你就不得不为此而编写你自己的测试(参见编写测试)

AC_CHECK_HEADER (headerfile [actioniffound [ actionifnotfound]])

如果系统头文件headerfile存在就执行shell命令actioniffound否则执行actionifnotfound如果你只需要在可以使用头文件的时候定义一个符号就考虑使用 AC_CHECK_HEADERS

AC_CHECK_HEADERS (headerfile [ actioniffound [ actionifnotfound]])

对于每个在以空格分隔的参数列表headerfile出现的头文件如果存在就定义 HAVE_headerfile(全部大写)如果给出了actioniffound它就是在找到一个头文件的时候执行的附加shell代码你可以把`break作为它的值以便在第一次匹配的时候跳出循环如果给出了actionifnotfound它就在找不到某个头文件的时候被执行

结构

以下的宏检查某些结构或者某些结构成员为了检查没有在此给出的结构使用AC_EGREP_CPP (参见检验声

上一篇:存储过程被锁无法编译的解决

下一篇:细粒度访问原则