Je tente de démarrer avec un simple code C odbc (avec un utilitaire assez simple dont j'ai besoin pour une application plus grande). Le problème est que je suis incapable d'obtenir mon cas de test simple pour le compiler et le lier à un binaire que je peux réellement exécuter.gcc ODBC sous Linux ne lie pas
Ce code provient du site easysoft, et est sur l'exemple le plus simple qu'ils ont disponible:
#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");
}
}
Ma déclaration de compilation est: gcc -o -lodbc listdrivers.c listdrivers
sortie de 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
Je pensais que peut-être il ne trouvait pas réellement la bibliothèque, alors j'ai spécifié le chemin sur le ligne de commande:
gcc -lodbc -L/usr/lib/x86_64-linux-gnu listdrivers.c -o listdrivers
Toujours pas de chance. J'ai également vérifié que le pilote est installé et configuré pour l'utilisation.
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
Je pensais que la bibliothèque elle-même est corrompu, mais qui semble aussi très bien:
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
La fonction est clairement listé dans la bibliothèque, et je ne vois aucune raison pour laquelle cette bibliothèque ne serait pas obtenir inclus, mais à ce moment, je suis coincé ...
Je J'ai également essayé de supprimer et de réinstaller les paquets unixodbc et unixodbc-dev en vain. Toute aide serait grandement appréciée car cela me rend fou maintenant.
Un peu plus d'informations: Je tente de compiler sur un système Ubuntu 15.05, mais j'ai également essayé sur Ubuntu 12.04 avec les mêmes résultats. Quand j'ai essayé cette même version sur un VM Fedora que j'avais à portée de main, j'ai pu construire sans problème, et le binaire généré fonctionne comme prévu ... Cela semble donc être spécifique à Ubuntu, mais peut-être à d'autres distributions basées sur Debian ? –