2015-10-08 1 views
0

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.

+0

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 ? –

Répondre

2

Donc, il s'avère que sur Ubuntu, le -lodbc doit venir après le fichier c. Donc, ce qui suit semble bien fonctionner:

gcc -o listdrivers.c listdrivers -lodbc

Je ne savais pas l'ordre ferait une différence dans ce cas, et sur Fedora l'ordre n'a pas question (peut-être une version différente de gcc, mais je n'ai pas vérifié spécifiquement)

+0

Salut, essayé ceci mais le mien dit "référence indéfinie à symbole" _... "erreur ajoutant des symboles, DSO manquant de la ligne de commande Savez-vous comment résoudre ceci? – user3503711