熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

autoconf手冊(四)

2013-11-13 15:24:40  來源: Oracle 

  對普通函數的檢查
  這些宏被用於尋找沒有包括在特定函數測試宏中的函數如果函數可能出現在除了缺省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 (參見檢驗聲
From:http://tw.wingwit.com/Article/program/Oracle/201311/16653.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.