程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 用Autoconf檢測MySQL軟件包的教程

用Autoconf檢測MySQL軟件包的教程

編輯:MySQL綜合教程

用Autoconf檢測MySQL軟件包的教程。本站提示廣大學習愛好者:(用Autoconf檢測MySQL軟件包的教程)文章只能為提供參考,不一定能成為您想要的結果。以下是用Autoconf檢測MySQL軟件包的教程正文


在你的法式(或許工程)中,假如編譯階段須要檢測以後情況中能否存在MySQL客戶端相干的庫文件時,你可使用Autoconf來幫你完成這個任務,輕巧、優雅、無痛。浏覽本文須要懂得簡略GNU Autoconf應用。
1. 本文的目的

目標:編譯時,依據configure參數(假如有--with-mysql),選擇性編譯對應的MySQL相干的功效。

完成:應用曾經寫好的m4劇本:ax_lib_mysql.m4
2. 若何應用Autoconf完成

年夜部門你想到的工作都曾經有人做過測驗考試了。這件工作也不破例,Autoconf中有許多劇本和指令幫你干事情。這裡,須要應用ax_lib_mysql.m4來贊助我們。先把該文件放到法式/工程目次中,並在configure.ac中新增以下指令來檢測MySQL庫文件和版本:
m4_include(ax_lib_mysql.m4)
AX_LIB_MYSQL()
AM_CONDITIONAL(BUILD_MYSQL_SUPPORT, test x$MYSQL_VERSION != x)

解釋:AX_LIB_MYSQL()設置了三個變量,可以在Makefile.am中直接應用,分離是MYSQL_CFLAGS、MYSQL_LDFLAGS、MYSQL_VERSION,別的還會在config.h中預界說宏HAVE_MYSQL;AM_CONDITIONAL(...)則會依據能否須要開啟MySQL支撐,來設置變量BUILD_MYSQL_SUPPORT,這個變量可以在Makefile.am中應用。

在法式源代碼中普通有兩種方法可以獲得HAVE_MYSQL宏的方法:一個是直接包括config.h;另外一個是在你法式的CFLAGS中新增-DHAVE_MYSQL。(留意:有的變量是可以在Makefile.am中應用,有的則是可以在C源代碼中應用)
辦法一:直接include config.h

Autoconf對象會將一切的預界說宏寄存在config.h(默許情形)中,並在編譯器選項中新增-DHAVE_CONFIG_H(經由過程@DEFS@)。由於文件ax_lib_mysql.m4中,包括了以下代碼(假如加上--with-mysql而且找到了對應mysql_config,那末以下代碼失效):
AC_DEFINE([HAVE_MYSQL], [1],
[Define to 1 if MySQL libraries are available])

所以,config.h中會有對應的宏界說:
/* Define to 1 if MySQL libraries are available */
#define HAVE_MYSQL 1

在你的源代碼中(普通是頭文件),新增以下代碼:
#ifdef HAVE_CONFIG_H
#include >config.h<
#endif

這以後,便可以在你的源代碼中,應用#ifdef HAVE_MYSQL ... #endif如許的寫法了
辦法二:編譯器選項新增-DHAVE_MYSQL

由於文件ax_lib_mysql.m4包括了變量界說MYSQL_CFLAGS/MYSQL_LDFLAGS/MYSQL_VERSION,所以,簡略的可以在Makefile.am中,直接依據這些變量來新增gcc編譯參數。相似以下寫法:
  if MYSQL_VERSION
XXX_CFLAGES= -DHAVE_MYSQL
endif

這以後,也能夠在你的源代碼中,應用#ifdef HAVE_MYSQL ... #endif如許的寫法了

小結:下面兩種辦法一個須要修正Makefile.am、一個須要修正頭文件,可以依據小我愛好來決議怎樣做。
3. 更多關於ax_lib_mysql.m4的應用
罕見的configure寫法

有了下面的設置,法式便可以經由過程以下的方法來肯定能否將MySQL客戶真個支撐編譯到源代碼中:
  ./configure --with-mysql
...
./configure --with-mysql[=no|yes]
...
./configure --with-mysql[=/YOUR_ENV_PATH/mysql_config] #假如mysql_config不在以後的$PATH中,則須要顯示指定。
...
假如對最低版本有請求

別的,假如你對MySQL版本有請求,例如,你願望只要檢測到5.5以上的MySQL客戶端,才編譯對MySQL的支撐,則可以在configure.ac中如許應用AX_LIB_MYSQL:
AX_LIB_MYSQL(5.5.18)
修正--with-mysql的默許行動

這裡意思是說,假如在configure中沒有--with-mysql選項時,則編譯時不加上對MySQL的支撐(假如寫了),也就是說以下兩種寫法意思雷同:
  ./configure --with-mysql=no
./configure

ax_lib_mysql.m4的默許行動並不是如斯,須要對其代碼做小小的修正:

  @@ -61,7 +61,7 @@
             MYSQL_CONFIG="$withval"
         fi
         ],
-        [want_mysql="yes"]
+        [want_mysql="no"]
     )
     AC_ARG_VAR([MYSQL_CONFIG], [Full path to mysql_config program])

如許就如願了。
4. 更普通的DEBUG選項

其實應用Autoconf這類用法更普通的是開啟或許封閉DEBUG選項。這個完成會比下面簡略許多。

目的:編譯時,依據configure參數(假如有--enable-debug),則履行法式中#ifdef DEBUG ... #endif。(常常看到如許的寫法吧)

比擬下面的--with-mysql這個就簡略多了(沒有版本信息、不須要找mysql_config等),所以完成也簡略多了,只需在你的configure.ac中新增以下代碼:

  AC_ARG_ENABLE(debug,
AS_HELP_STRING([--enable-debug],
               [enable debugging, default: no]),
[case "${enableval}" in
             yes) debug=true ;;
             no)  debug=false ;;
             *)   AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;;
esac],
[debug=false])
AM_CONDITIONAL(DEBUG, test x"$debug" = x"true")

假如configure時,帶有參數--enable-debug,則設置挪用AM_CONDITIONAL設置遍歷DEBUG。如許便可以在Makefile中依據遍歷DEBUG,來選擇性的新增編譯參數-DDEBUG,所以配套的還須要再Makefile.am中新增:
  if DEBUG
XXX_CFALGS=... -DDEBUG
else
XXX_CFALGS=...
fi

這時候,你的代碼中便可以寫#ifdef DEBUG ... #endif了。

另外一種包括config.h的辦法跟後面相似,只不外須要將AM_CONDITIONAL那邊換成:
  if test x"$debug" = x"true"
AC_DEFINE([HAVE_MYSQL], [1],
[Define to 1 if MySQL libraries are available])
fi

那末法式代碼中include >config.h<便可以了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved