用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

Android获取屏幕或View宽度和高度的方法

php文件服务实现虚拟挂载其他目录示例

C++设计模式之观察者模式

html5配合css3实现带提示文字的输入框(摆脱js)

JavaScript检测字符串中是否含有html标签实现方法

C#的SQL操作类实例

iOS中的NSURLCache数据缓存类用法解析

基于递归实现的php树形菜单代码

利用CSS span实现双语菜单的方法教程

PHP批量生成静态HTML的简单原理和方法

Win10最新预览版怎么还原以前Win7或Win8?

MySQL数学函数简明总结

MySQL页面访问统计及排名情况

JavaScript实现随机替换图片的方法

mysql autoconf_MySQL_用Autoconf检测MySQL软件包的教程,在你的程序(或者工程)中,如 - phpStudy...相关推荐

  1. 数据库面试题:Mysql如何进行死锁检测

    Mysql如何进行死锁检测 mysql的InndoDB存储引擎使用wair-for graph(等待图)的方式来进行死锁检测. wair-for graph要求数据库保存一下两种信息: 锁的信息链表 ...

  2. dnf台服升级mysql_2.11.7使用MySQL Yum存储库升级MySQL

    对于受支持的基于Yum的平台(请参见 第2.5.1节"使用MySQL Yum存储库在Linux上安装MySQL"以获取列表),可以对MySQL执行就地升级(即替换旧版本,然后使用旧 ...

  3. php mysql 值是否存在_php检测mysql表是否存在的方法小结

    本文实例讲述了php检测mysql表是否存在的方法.分享给大家供大家参考,具体如下: pdo: $dsn = 'mysql:dbname=test;host=127.0.0.1'; $user = ' ...

  4. zabbix查看mysql同步_Zabbix 检测Mysql数据库的主从同步

    在高并发网站架构中,MySQL数据库主从同步是不可或缺的,不过经常会发生由于网络原因或者操作错误,MySQL主从经常会出现不同步的情况,那么如何监控MySQL主从同步,也变成检测网站正常运行的重要环节 ...

  5. mysql语句性能开销检测profiling详解

    转载自 mysql语句性能开销检测profiling详解 之前我介绍过msyql查询优化explain检查命令的使用,explain主要是检查sql语句的基本性能,sql是否优秀,但不能查看具体的涉及 ...

  6. linux 检测mysql链接_MySQL笔记

    #忘记原始密码 1.修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 2.重启mysql:service restart stop 3.刷新权 ...

  7. 如何监测mysql主从复制状态_如何实时检测mysql主从状态,并做邮件告警?

    实时检测mysql主从状态,并做邮件告警 需求分析: 当我们做完主从后,主从成功的话,Slave_IO_Running和Slave_SQL_Running两个进程的状态就为yes,但是在做主从同步时也 ...

  8. mysql yum包,如何使用MySQL yum源来安装更新MySQL相关软件包

    MySQL yum库提供了一个简单的和方便的方法来安装和更新MySQL相关的软件包到最新版本. MySQL yum库文档说明:http://dev.mysql.com/doc/mysql-yum-re ...

  9. mysqladmin检测MySQL运行状态

    执行命令: mysqladmin -uroot -pXX ping 显示以下结果为正常: mysqld is alive mysqladmin检测MySQL运行状态脚本: #!/bin/bash ho ...

  10. mha检测mysql报错_MySQL MHA 报错处理

    安装环境:CentOS 6.5 MySQL 5.7.22 MHA 0.56 1.找不到mysql 命令 Sat Mar 23 07:17:50 2019 - [info] Connecting to ...

最新文章

  1. 当统计信息不准确时,CBO可能产生错误的执行计划,并在10053 trace中找到CBO出错的位置示例...
  2. 基于改进SURF算法的实时视频拼接
  3. 【转】3D之神JohnCarmack
  4. 如何进行云主机迁移?看这一篇文章就够了!
  5. bzoj1013,luogu4035-[JSOI2008]球形空间产生器【高斯消元】
  6. java字节码指令简介(仅了解)
  7. 番茄todo电脑版_TODO清单|高效时间管理 支持多平台多设备同步 解锁VIP
  8. glibc的几个有用的处理二进制位的内置函数(转)
  9. android购物车计数器,Axure教程:计数器的实战应用场景 —— 商品购件数
  10. java jdbc 下载_java jdbc驱动 下载
  11. c++ atuo_ptr 的实现原理
  12. c++小游戏:笨鸟先飞(Flappy bird hhh)
  13. 3D结构光摄像头深度算法介绍
  14. upc 6605 所罗门王的宝藏
  15. java gef_【插件开发】—— 12 GEF入门
  16. 【数据库】数据库绪论,你都会了吗
  17. oracle循环数据字典,Oracle DUL工作原理和技术实现
  18. Chrome 神器面世!谷歌学术搜文章,代码链接自动展示
  19. Ubuntu安装图形化界面
  20. Mac OS X 系统清理

热门文章

  1. 企业框架源码 SpringMVC mybatis ehcache shiro maven
  2. ASCII、Unicode、GBK和UTF-8字符编码的区别联系[转]
  3. RHEL6.1 去掉开机总是提示注册啊,去掉rhsm-compliance-icon小图标
  4. 关系分析可视化插件-Cytoscape
  5. a1277以太网适配器驱动_福禄克DSX系列工业以太网连接器集锦
  6. python中注释的定义_Python注释及变量
  7. sql两张表,分组或row_number()取最新的记录SQL
  8. 计算机系统结构自考应用题,2017年10月自考02325计算机系统结构真题及答案
  9. 午休,要有午休床,也要有毛毯
  10. 2021-08-24梦笔记