OVH Cloud OVH Cloud

ODBC Windows - Erreur à l'édition de liens

2 réponses
Avatar
mrambil
Bonjour,
J'ai quelques probl=E8mes dans l'utilisation de l'API ODBC MS. A vrai
dire je ne sais pas si je l'utilise de la bonne mani=E8re

J'utilise Dev-cpp avec gcc/g++ v3.4.2 sur Win XP.

Je dois me connecter =E0 une system DSN install=E9e sur mon ordinateur.
Voici mes sources :

#include <windows.h>
#include <iostream>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <odbcinst.h>
#include <sqlucode.h>
#define STR_LEN 30
#define _DEBUG 1
#if _DEBUG
#define DEBUG(str) cout<<str<<endl;
#else
#define DEBUG(str)
#endif

SQLHENV henv; /* environment handle */
SQLHDBC hdbc; /* connection handle */
HSTMT hstmt; /* statement handle */
SDWORD retcode; /* return code */
UCHAR info[STR_LEN]; /* info string for SQLGetInfo
*/
SQLSMALLINT inf;
int main(void){
retcode =3D SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
retcode =3D SQLAllocConnect(henv,&hdbc);
retcode =3D SQLConnect(hdbc, (SQLCHAR*)"SAGE_GESCOM", SQL_NTS,
(SQLCHAR*)"Mo", SQL_NTS, (SQLCHAR*)"",SQL_NTS);
retcode =3D SQLGetInfo(hdbc,SQL_DBMS_VER, &info, STR_LEN,&inf);

printf("Current DBMS version is %s\n", info);

SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
return 0;

}

Vous le voyez, ce code est simple. Je pense qu'il s'=E9x=E9cuterait sans
probl=E8me si seulement je pouvais le compiler et faire l'=E9dition de
liens !
Voici les commandes que j'utilise pour compiler/linker ainsi que les
erreurs du linker :

g++.exe -c main.cpp -o main.o
-I"C:/Dev-Cpp5/lib/gcc/mingw32/3.4.2/include"
-I"C:/Dev-Cpp5/include/c++/3.4.2/backward"
-I"C:/Dev-Cpp5/include/c++/3.4.2/mingw32"
-I"C:/Dev-Cpp5/include/c++/3.4.2" -I"C:/Dev-Cpp5/include"

g++.exe main.o -o "sageedi.exe" -L"C:/Dev-Cpp5/lib"
main.o(.text+0x142):main.cpp: undefined reference to
`SQLAllocHandle@12'
main.o(.text+0x160):main.cpp: undefined reference to
`SQLAllocConnect@8'
main.o(.text+0x1a6):main.cpp: undefined reference to `SQLConnect@28'
main.o(.text+0x1dc):main.cpp: undefined reference to `SQLGetInfo@20'
main.o(.text+0x206):main.cpp: undefined reference to `SQLDisconnect@4'
main.o(.text+0x216):main.cpp: undefined reference to `SQLFreeConnect@4'
main.o(.text+0x226):main.cpp: undefined reference to `SQLFreeEnv@4'
collect2: ld returned 1 exit status

Je ne comprend pas ces erreurs : Les biblioth=E8ques que j'ai dans
C:/Dev-Cpp5/lib sont (peut-=EAtre que ces deux modules n'ont rien a voir
avec mon probl=E8me) :
libodbccp32.a
libodbc32.a

Je suppose qu'il manque une biblioth=E8que mais je ne sais pas laquelle
ni comment la r=E9cup=E9rer.

Toute aide serait la bienvenue,

Mohamed Rambil

2 réponses

Avatar
kanze
mrambil wrote:

J'ai quelques problèmes dans l'utilisation de l'API ODBC
MS. A vrai dire je ne sais pas si je l'utilise de la bonne
manière

J'utilise Dev-cpp avec gcc/g++ v3.4.2 sur Win XP.

Je dois me connecter à une system DSN installée sur mon
ordinateur. Voici mes sources :


[...]
Voici les commandes que j'utilise pour compiler/linker ainsi
que les erreurs du linker :

g++.exe -c main.cpp -o main.o
-I"C:/Dev-Cpp5/lib/gcc/mingw32/3.4.2/include"
-I"C:/Dev-Cpp5/include/c++/3.4.2/backward"
-I"C:/Dev-Cpp5/include/c++/3.4.2/mingw32"
-I"C:/Dev-Cpp5/include/c++/3.4.2" -I"C:/Dev-Cpp5/include"

g++.exe main.o -o "sageedi.exe" -L"C:/Dev-Cpp5/lib"
main.o(.text+0x142):main.cpp: undefined reference to
`'
main.o(.text+0x160):main.cpp: undefined reference to
`'
main.o(.text+0x1a6):main.cpp: undefined reference to `'
main.o(.text+0x1dc):main.cpp: undefined reference to `'
main.o(.text+0x206):main.cpp: undefined reference to
`'

main.o(.text+0x216):main.cpp: undefined reference to
`'

main.o(.text+0x226):main.cpp: undefined reference to `'
collect2: ld returned 1 exit status

Je ne comprend pas ces erreurs : Les bibliothèques que j'ai dans
C:/Dev-Cpp5/lib sont (peut-être que ces deux modules n'ont rien a
voir

avec mon problème) :
libodbccp32.a
libodbc32.a

Je suppose qu'il manque une bibliothèque mais je ne sais pas
laquelle ni comment la récupérer.


En général, si tu utilises des bibliothèques autres que celles
du système ou de l'implémentation, il faut le dire au
compilateur : dans le cas de g++, l'option est -l, ou -lxxx fait
utiliser la bibliothèque libxxx.a. Aussi, l'ordre est
important. Mais à tout hazard, j'essaierais :
g++ main.o -o sageddi.exe -Lc:/Dev-Cpp5/include -lodbccp32 -lodbc32
et si ça ne marche pas, en inversant l'ordre des options -l.

Encore qu'à vrai dire, j'essaierais d'abord à trouver de la doc,
qui me dit exactement ce qu'il faut.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
mrambil
J'ai résolu le problème en ajoutant libodbc32.dll à la liste des
fichiers du projets sous Dev-C++