编写configure.ac/in文件加入mysql 的include和libs的路径自动检测或由用户指定.

本文介绍了一种利用MySQL_config程序检测安装路径的方法,以及通过配置脚本实现自动化的解决方案,适用于不同Linux环境的MySQL安装路径检测。

mysql不同linux下的安装路径不大相同,直接中包括,不同的版本下编译比较麻烦,装mysql也N种方法,还有x86和x64版本同时装的,搞得很混乱,参考了一下别人的检测做法,目前发现两种:

 

1. 装了mysql开发库之后(你Yum,build from source, emerge 等等),会顺便安装一个mysql_config的程序,它可以输出mysql的include和libs路径,  使用am工具可以在configure.ac写以下脚本,让用户自行给一个mysql_config的执行路径,或使用默认的来检测.
   configure.in
   AC_MSG_CHECKING(for MySQL support) 输出检查信息
   AC_ARG_WITH(mysql,
    AC_HELP_STRING([--with-mysql@<:@=PATH@:>@],[Include MySQL support. PATH is the path to 'mysql_config']),
    [WITH_MYSQL=$withval],[WITH_MYSQL=yes])
   
    <---定义一个configure配置项,withval 是用户输入值, yes设置默认值
   
    AC_PATH_PROG(MYSQL_CONFIG, mysql_config)
   
    AC_SUBST(MYSQL_LIBS) 替换Makefile.am中的变量 $(MYSQL_LIBS)
    AC_SUBST(MYSQL_INCLUDE) 替换Makefile.am中的变量 $(MYSQL_INCLUDE)
    完整检测代码:
       if test "$WITH_MYSQL" != "no"; then
      AC_MSG_RESULT(yes)
      if test "$WITH_MYSQL" = "yes" ; then
        AC_PATH_PROG(MYSQL_CONFIG, mysql_config)
      else
        MYSQL_CONFIG=$WITH_MYSQL
      fi
    dnl  AC_PATH_PROG(MYSQL_CONFIG, mysql_config)
    
      if test "$MYSQL_CONFIG" = ""; then
        AC_MSG_ERROR(mysql_config is not found)
      fi
      if test /! -x $MYSQL_CONFIG; then
        AC_MSG_ERROR(mysql_config not exists or not executable, use --with-mysql=path-to-mysql_config)
      fi
    
      if $MYSQL_CONFIG | grep -- '--include' > /dev/null ; then
        MYSQL_INCLUDE="`$MYSQL_CONFIG --include | sed s//'//g`"
      else
        MYSQL_INCLUDE="`$MYSQL_CONFIG --cflags | sed s//'//g`"
      fi
      MYSQL_LIBS="`$MYSQL_CONFIG --libs | sed s//'//g`"
    
      AC_MSG_CHECKING(for MySQL includes at)
      AC_MSG_RESULT($MYSQL_INCLUDE)
    
      AC_MSG_CHECKING(for MySQL libraries at)
      AC_MSG_RESULT($MYSQL_LIBS)
    dnl check for errmsg.h, which isn't installed by some versions of 3.21
      old_CPPFLAGS="$CPPFLAGS"
      CPPFLAGS="$CPPFLAGS $MYSQL_INCLUDE"
      AC_CHECK_HEADERS(errmsg.h mysql.h)
      CPPFLAGS="$old_CPPFLAGS"
    
      AC_DEFINE([HAVE_MYSQL], [1], [mysql support])
    else
      AC_MSG_RESULT(no)
    fi

 

2. 使用mysql监听的unix-domain socket来获得这些信息, 参考PHP的做法.

 

nansn@nansn-pc:~/Qt5.14.2/5.14.2/Src/qtbase/src/plugins/sqldrivers$ make cd mysql/ && ( test -e Makefile || /usr/lib/qt5/bin/qmake -o Makefile /home/nansn/Qt5.14.2/5.14.2/Src/qtbase/src/plugins/sqldrivers/mysql/mysql.pro INCLUDEPATH+=/usr/include/mysql 'LIBS+=-L/usr/lib/x86_64-linux-gnu -lmysqlclient' ) && make -f Makefile make[1]: 进入目录“/home/nansn/Qt5.14.2/5.14.2/Src/qtbase/src/plugins/sqldrivers/mysql” g++ -c -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -O2 -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -Wvla -Wdate-time -Wshift-overflow=2 -Wduplicated-cond -Wno-stringop-overflow -Wno-deprecated-copy -Wno-redundant-move -Wno-format-overflow -Wno-init-list-lifetime -D_REENTRANT -fPIC -DQT_NO_JAVA_STYLE_ITERATORS -DQT_DEPRECATED_WARNINGS -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -I. -isystem /usr/include/mysql -isystem /usr/include/x86_64-linux-gnu/qt5/QtSql/5.12.12 -isystem /usr/include/x86_64-linux-gnu/qt5/QtSql/5.12.12/QtSql -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore/5.12.12 -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore/5.12.12/QtCore -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtSql -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I.moc -isystem /usr/include/mysql -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -o .obj/qsql_mysql.o qsql_mysql.cpp qsql_mysql.cpp:57:10: fatal error: QtSql/private/qsqldriver_p.h: 没有那个文件目录 57 | #include <QtSql/private/qsqldriver_p.h> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. make[1]: *** [Makefile:382:.obj/qsql_mysql.o] 错误 1 make[1]: 离开目录“/home/nansn/Qt5.14.2/5.14.2/Src/qtbase/src/plugins/sqldrivers/mysql” make: *** [Makefile:48:sub-mysql-make_first] 错误 2
09-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值