我正试图启动并运行一些简单的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 Alloc
   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,但我没有具体检查)

10-07 16:43