簡體   English   中英

使用autoconf檢查C #define的值

[英]Check value of C #define with autoconf

我知道我可以使用AC_CHECK_DECL / AC_CHECK_DECLS來檢查一組標頭是否為指定的標識符提供了聲明,但是如何不僅檢查是否聲明了宏,還檢查其擴展是否符合我的條件? 具體來說,我想檢查numa.h是否包含與此等效的宏定義...

#define LIBNUMA_API_VERSION 2

...包括特定值“ 2”。

UPDATE<numa.h>標頭包含一個定義,例如#define LIBNUMA_API_VERSION 2以聲明其版本。 使用此標頭的C代碼通常按如下方式使用它:

#if defined(LIBNUMA_API_VERSION) && LIBNUMA_API_VERSION >= 2
....
#endif

我想使用autoconf確定NUMA標頭版本,並定義一個宏來簡要傳達是否提供了NUMA版本2。 即:

if test "$have_numa_v2" = "yes" ; then
    AC_DEFINE(NUMA_VERSION_2, 1, [Determine whether NUMA v2 available)
fi

可以這樣使用:

#ifdef NUMA_VERSION_2
....
#endif

可能嗎? 我在確定如何在Autoconf文件中設置變量have_numa_v2變量的值時遇到了麻煩。

您可以將AC_COMPILE_IFELSEAC_RUN_IFELSE與結構適當的測試程序一起使用,以確定是否將宏定義為您指定的特定值。 例如,假設當前語言是C:

have_numa_v2=no
AC_RUN_IFELSE([AC_LANG_PROGRAM([
#include <numa.h>
],[
#if LIBNUMA_API_VERSION != 2
exit(1);
#endif
])], [have_numa_v2=yes])

這將構造一個程序,其返回值取決於是否將LIBNUMA_API_VERSION定義為宏,如果這樣,則將其擴展為2 如果Autoconf無法編譯它(例如,找不到numa.h),或者以0以外的狀態退出,則其他任何事情都不會發生( $have_numa_v2保留其分配的值"no" )。 否則,執行第二個參數中的賦值,並且$have_numa_v2最終以值"yes"

就其價值而言,該宏生成和使用的特定測試程序的源包含一些Autoconf標准的宏定義,以及以下內容:

#include <numa.h>

int
main ()
{

#if LIBNUMA_API_VERSION != 2
exit(1);
#endif

  ;
  return 0;
}

使用AC_COMPILE_IFELSE的版本將是類似的,但如果未將宏定義為指定的值,則使用#error預處理程序指令進行編譯,以使編譯失敗。 如果您預料到程序可能會針對外國體系結構交叉編譯,那么這種變化可能是更好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM