gpt4 book ai didi

c - Linux 上的 gcc ODBC 未链接

转载 作者:太空宇宙 更新时间:2023-11-04 08:22:02 24 4
gpt4 key购买 nike

我正在尝试启动并运行一些简单的 C odbc 代码(考虑到一个相当简单的实用程序,我需要一个更大的应用程序)。问题是,到目前为止,我无法将我的简单测试用例编译并链接到我可以实际执行的二进制文件中。

此代码来自 easysoft 网站,是他们可用的最简单示例:

#include <stdio.h>
#include <sql.h>
#include <sqlext.h>

main() {
SQLHENV env;
char driver[256];
char attr[256];
SQLSMALLINT driver_ret;
SQLSMALLINT attr_ret;
SQLUSMALLINT direction;
SQLRETURN ret;

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);

direction = SQL_FETCH_FIRST;
while(SQL_SUCCEEDED(ret = SQLDrivers(env, direction,
driver, sizeof(driver), &driver_ret,
attr, sizeof(attr), &attr_ret))) {
direction = SQL_FETCH_NEXT;
printf("%s - %s\n", driver, attr);
if (ret == SQL_SUCCESS_WITH_INFO) printf("\tdata truncation\n");
}
}

我的编译语句是:gcc -lodbc listdrivers.c -o listdrivers

gcc 的输出:

/tmp/cchgAMyC.o: In function `main':
listdrivers.c:(.text+0x2f): undefined reference to `SQLAllocHandle'
listdrivers.c:(.text+0x4d): undefined reference to `SQLSetEnvAttr'
listdrivers.c:(.text+0xd8): undefined reference to `SQLDrivers'
collect2: error: ld returned 1 exit status

我想也许它实际上并没有找到库,所以我在命令行中指定了路径:

gcc -lodbc -L/usr/lib/x86_64-linux-gnu listdrivers.c -o listdrivers

仍然没有运气。我还验证了驱动程序已安装并已配置使用。

ldconfig -p | grep odbc

libodbcinstQ4.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libodbcinstQ4.so.1
libodbcinst.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libodbcinst.so.2
libodbcinst.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libodbcinst.so
libodbccr.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libodbccr.so.2
libodbccr.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libodbccr.so
libodbc.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libodbc.so.2
libodbc.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libodbc.so
libiodbcinst.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libiodbcinst.so.2
libiodbcadm.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libiodbcadm.so.2
libiodbc.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libiodbc.so.2

然后我想也许库本身已损坏,但看起来也不错:

readelf -Ws/usr/lib/x86_64-linux-gnu/libodbc.so | grep 分配

   113: 0000000000007870    21 FUNC    GLOBAL DEFAULT   11 SQLAllocStmt
148: 0000000000007820 67 FUNC GLOBAL DEFAULT 11 SQLAllocHandleStd
164: 0000000000007810 10 FUNC GLOBAL DEFAULT 11 SQLAllocHandle
196: 0000000000006720 21 FUNC GLOBAL DEFAULT 11 SQLAllocConnect
213: 0000000000006740 20 FUNC GLOBAL DEFAULT 11 SQLAllocEnv

该函数清楚地列在库中,我看不出没有理由不包含该库,但在这一点上,我卡住了...

我也曾尝试删除并重新安装 unixodbc 和 unixodbc-dev 软件包,但无济于事。任何帮助将不胜感激,因为这现在让我发疯。

最佳答案

事实证明,在 Ubuntu 上,-lodbc 需要位于 c 文件之后。所以以下似乎工作正常:

gcc listdrivers.c -o listdrivers -lodbc

我没有意识到在这种情况下顺序会有什么不同,在 Fedora 上顺序无关紧要(可能是不同版本的 gcc,但我没有具体检查)

关于c - Linux 上的 gcc ODBC 未链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33020646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com