You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

问题分析

从调试输出可以看出:

  1. ODBC_CFLAGS 包含大量系统特性检测宏(如 HAVE_UNISTD_H),而非 pkg-config odbc --cflags 应返回的纯ODBC编译路径参数。这说明系统中存在 odbc_config 工具,导致进入了 AS_IF 的第一个分支,但该工具返回的 --cflags 内容不符合预期,混入了无关宏定义。
  2. 虽然 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)

额外验证步骤

  1. 执行 pkg-config odbc --cflags 和 odbc_config --cflags,对比两者输出差异,确认 odbc_config 是否返回了多余的宏定义。
  2. 如果必须使用 odbc_config,可以手动过滤其输出中的无关宏,例如:
    ODBC_CFLAGS=`$ODBC_CONFIG --cflags | grep -v "^-DHAVE_"`
    

内容的提问来源于stack exchange,提问作者Igor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.04 20:13:13