gcc ODBC в Linux не связывает

Я пытаюсь начать работу с некоторым простым кодом odbc на C (с довольно простой утилитой, которая нужна мне для более крупного приложения). Проблема в том, что я до сих пор не могу заставить мой простой тестовый пример скомпилировать и связать в двоичный файл, который я действительно могу выполнить.

Этот код взят с веб-сайта 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 безрезультатно. Любая помощь будет принята с благодарностью, так как это сводит меня с ума.

1 ответ

Получается, что в Ubuntu, -lodbc должен идти после файла c. Таким образом, следующее, кажется, работает нормально:

gcc listdrivers.c -o listdrivers -lodbc

Я не предполагал, что порядок будет иметь значение в этом случае, и в Fedora порядок не имеет значения (возможно, это другая версия gcc, но я не проверял конкретно)

Другие вопросы по тегам