修改configure.ac与Makefile.am后程序报错SQLInstallerErrorW未找到
SQLInstallerErrorW 未找到问题排查与解决
配置代码
修改后的 configure.ac
AC_CHECK_PROG([ODBC_CONFIG], [odbc_config], [odbc_config], [no]) AS_IF([test "x$ODBC_CONFIG" != "xno"], [ ODBC_CFLAGS=`$ODBC_CONFIG --cflags` ODBC_LIBS=`$ODBC_CONFIG --libs` ], [ PKG_CHECK_MODULES([ODBC], [odbc]) ]) ODBC_LIBS="$ODBC_LIBS -lodbcinst" AC_SUBST(ODBC_CFLAGS) AC_SUBST(ODBC_LIBS)
配套的 Makefile.am
libodbc_lib_la_CXXFLAGS = -I../../dbinterface \ -DUNICODE \ -DUNIXODBC \ $(ODBC_CFLAGS) \ @DBTOOLKIT@ libodbc_lib_la_LDFLAGS = -L../dbinterface \ -ldbinterface \ $(ODBC_LIBS)
问题现象
编译完成后运行程序,报错 SQLInstallerErrorW 无法找到。但直接在 Makefile.am 中硬编码 pkg-config 命令时,程序运行完全正常:
正常运行的硬编码配置
libodbc_lib_la_CXXFLAGS = -I../../dbinterface \ -DUNICODE \ -DUNIXODBC \ `pkg-config \ odbc \ --cflags`\ @DBTOOLKIT@ libodbc_lib_la_LDFLAGS = -L../dbinterface \ -ldbinterface \ `pkg-config \ odbc \ --libs` \ -lodbcinst
排查信息
在 configure.ac 中添加调试输出语句:
AC_MSG_NOTICE([Variable is $ODBC_CFLAGS]) AC_MSG_NOTICE([Variable is $ODBC_LIBS])
执行 configure 后得到以下输出:
configure: Variable is -DHAVE_UNISTD_H -DHAVE_PWD_H -DHAVE_SYS_TYPES_H -DHAVE_LONG_LONG -DSIZEOF_LONG_INT=8 -I/usr/include configure: Variable is -L/usr/lib64 -lodbc -lodbcinst
问题分析
从调试输出可以看出:
ODBC_CFLAGS包含大量系统特性检测宏(如HAVE_UNISTD_H),而非pkg-config odbc --cflags应返回的纯ODBC编译路径参数。这说明系统中存在odbc_config工具,导致进入了AS_IF的第一个分支,但该工具返回的--cflags内容不符合预期,混入了无关宏定义。- 虽然
ODBC_LIBS已包含-lodbcinst(SQLInstallerErrorW 所在库),但编译时的宏差异可能导致符号匹配失败,或者odbc_config返回的链接参数存在隐性问题。
解决方法
优先使用 pkg-config 进行配置(与硬编码时的工作逻辑一致),调整 configure.ac 的分支顺序:
# 优先尝试 pkg-config PKG_CHECK_MODULES([ODBC], [odbc], [], [ # pkg-config 失败时,再尝试 odbc_config AC_CHECK_PROG([ODBC_CONFIG], [odbc_config], [odbc_config], [no]) AS_IF([test "x$ODBC_CONFIG" = "xno"], [ AC_MSG_ERROR([无法找到 pkg-config odbc 或 odbc_config 工具]) ]) ODBC_CFLAGS=`$ODBC_CONFIG --cflags` ODBC_LIBS=`$ODBC_CONFIG --libs` ]) # 追加 odbcinst 库链接 ODBC_LIBS="$ODBC_LIBS -lodbcinst" AC_SUBST(ODBC_CFLAGS) AC_SUBST(ODBC_LIBS)
额外验证步骤
- 执行
pkg-config odbc --cflags和odbc_config --cflags,对比两者输出差异,确认odbc_config是否返回了多余的宏定义。 - 如果必须使用
odbc_config,可以手动过滤其输出中的无关宏,例如:ODBC_CFLAGS=`$ODBC_CONFIG --cflags | grep -v "^-DHAVE_"`
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

