Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Interfaces de programmation
Interfaces de programmation Forum d'entraide sur l'utilisation des API Oracle : Pré-compilateurs, OCI, OCCI, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/01/2012, 16h21   #1
Invité de passage
 
Inscription : avril 2006
Messages : 5
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 5
Points : 2
Points : 2
Envoyer un message via MSN à conon95
Par défaut [OCILIB] Pb mise en oeuvre : symbole externe non résolu _OCI_Initialize

Bonjour,
J'avais déjà utilisé avec succès l'API il y a longtemps.
Là, j'ai un PC 'tout neuf' sur lequel j'ai à nouveau besoin de l'API.

Il me semble avoir bien suvi le tutoriel de Vincent ROGIER, pourtant, dès que j'utilise la moindre fonction, notamment la première : OCI_Initialize
J'obtiens l'erreur de compilation :
error LNK2019: symbole externe non résolu _OCI_Initialize

Je sais, je ne suis pas le premier, et j'ai déjà regardé de près de nombreuses réponses à ce problème, et testé plusieurs choses, mais rien n'y fait.
Quelqu'un peut-il m'aider?

Ma config :
* Windows 7 64 bits
* Oracle 11g
* Visual Studio et VC++ 2010
* OCILIB dernière version téléchargée: ocilib-3.9.3-windows.zip

Création d'un PG en suivant le tutoriel :
* Application console Win32 (sans changer les options par défaut)
* copie de ocilib.h dans le répertoire du projet accessible par le projet
* ociliba.lib (64bits) dans le répertoire du projet accessible par le projet
* ociliba.dll (64bits) : copiée dans Windows\system32
* ajout des deux lignes :
Code :
1
2
3
 
	#include "ocilib.h"
	#pragma comment(lib,"ociliba.lib")
avant mon main, ce qui donne :
Code :
1
2
3
4
5
6
7
8
9
 
	#include "stdafx.h"
	#include "ocilib.h"
	#pragma comment(lib,"ociliba.lib")
 
	int _tmain(int argc, _TCHAR* argv[])
	{
		RETURN 0;
	}
* Jusque là, le programme compile sans erreur ni warning.
* Important : pour le moment, je ne me suis pas préoccupé de OCI_API puisque, dans ocilib.h, il est précisé en commentaire :
Code :
1
2
3
 
 * ON Windows, OCI_API MUST be SET TO __stdcall IN ORDER TO USE prebuilt libraries
 * FROM v3.5.0, ocilib.h automatically sets OCI_API TO  __stdcall WITH MS compilers
* Mais si j'ajoute la fonction OCI_Initialize dans le main :
Code :
1
2
3
4
5
6
 
	int _tmain(int argc, _TCHAR* argv[])
	{
		OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT);
		RETURN 0;
	}
* J'obtiens l'erreur "error LNK2001: symbole externe non résolu _OCI_Initialize@12" etc..
* On ne peut pourtant pas faire tellement plus simple comme programme, mais je ne m'en sors pas

Ce que j'ai fait :
* que je déclare ou non ocilib.h dans les fichiers d'en-tête de l'explorateur de solutions ne change rien (normal, il est déjà déclaré en #include)
* que je déclare ou non ocilia.lib dans les dépendances supplémentaires de l'éditeur de liens ne change rien (normal, elle est déjà déclarée en #pragma)
* que j'ajoute à mon code tout ou partie des 3 define ne change rien, même si je sais que c'est inutile puisque fait dans ocilib.h :
Code :
1
2
3
4
5
6
 
	#include "ocilib.h"
	#define OCI_IMPORT_RUNTIME
	#define OCI_CHARSET_ANSI
	#define OCI_API __sdtcall
	#pragma comment(lib,"ociliba.lib")
* au lieu du #define, si je définis OCI_API=__sdtcall dans dans les options du préprocesseur du projet, j'ai d'autres erreurs complètement différentes, du genre plus de reconnaissance de la syntaxe dans ocilib.h. C'est peut-être à creuser, mais comme je pense m'éloigner de mon sujet, j'abandonne cette piste.

AUTRE PISTE
* Je me dis alors que je peux essayer de compiler un des projets fournis dans zip
* J'ouvre un des projets \ocilib\proj\test\ocilib_demo_vs2010.sln
* Il s'ouvre correctement
* Je fais un essai de compilation, pour voir : le compilateur m'avertit qu'il ne trouve pas ocilib.h ni ociliba.lib. Je les rends accessibles et je réessaie de recompiler
* Surprise : j'obtiens toute une liste d'erreurs du type 'symbole externe non résolu', autant que de fonctions de l'API utilisées et dans l'ordre d'apparition:
Code :
1
2
3
4
5
6
 
1>ocilib_demo.obj : error LNK2019: symbole externe non résolu _OCI_ErrorGetString@4 référencé dans la fonction _err_handler
1>ocilib_demo.obj : error LNK2019: symbole externe non résolu _OCI_ErrorGetType@4 référencé dans la fonction _err_handler
1>ocilib_demo.obj : error LNK2019: symbole externe non résolu _OCI_GetLastError@0 référencé dans la fonction _main
1>ocilib_demo.obj : error LNK2019: symbole externe non résolu _OCI_StatementCreate@4 référencé dans la fonction _main
1>ocilib_demo.obj : error LNK2019: symbole externe non résolu _OCI_ConnectionCreate@16 référencé dans la fonction _main
* A la fois je suis content d'avoir les mêmes erreurs que lorsque je crée un projet moi-même. Mais ça ne résoud pas mon problème pour autant.


J'avoue que je ne vois plus quoi faire.
Si l'un d'entre vous a une idée, je suis preneur, et ça m'enlèvera une grosse épine du pied.
conon95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 23h06   #2
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Salut,

La conventation d'appel n'est pas

mais .

C'est pour ca que quand tu le rajoutes, le compilateur gueule.

DE plus les différents #define que tu mentionnes sont placés dans ton post apres l'include à ocilib.h, ce qui ne sert a rien puisqu'il faut les definir avant (sinon il ne sont pas vus par le header...)

OCILIB definit automatiquement OCI_API à la valeur "__stdcall" seulement si _MSC_VER est définit...

L'erreur initiale que tu as n'est pas une erreur de compilation mais de linkage. Le linker de VC++ ne trouve pas les symboles. Donc voici les 3 raisons possibles :

  • soit le fichier lib n'est pas dans un répertoire accessible au linker (voir les options d'include de librairies ou des options du projet, dans la section du linker)
  • soit tu essaies de linker un code 32bits avec un fichier lib 64bits (par défaut, VS2010 compile en 32bits. Donc si tu n'as pas installé la sdk 64bits ni son support dans VS2010, ou que tu n'as pas targeté dans le projet la plateforme 64bits, tu compile en 32bits) ou vice versa. Je note que tu mentionnes le fichier ociliba.lib en version 64bits
  • soit la convention OCI_API n'a pas été settée sur __stdcall car _MSC_VER n'as pas été détecté.

Vérifie tout ca car un des points cité doit être la cause de tes soucis
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2012, 02h01   #3
Invité de passage
 
Inscription : avril 2006
Messages : 5
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 5
Points : 2
Points : 2
Envoyer un message via MSN à conon95
Par défaut [OCILIB] mon Pb est résolu (symbole externe non résolu _OCI_Initialize)

Salut Vincent,
Je ne sais pas comment tu arrives à répondre à autant de monde, aussi vite et... aussi bien surtout !
En effet, l'une de tes trois propositions est la bonne.

Même si je suis sur une machine 64 bits, ce sont bien les fichier .lib et .dll en 32 bits que je dois utiliser dans mon Visual Studio 2010.

Merci beaucoup, mon problème est résolu.

PS: J'en ai maintenant un autre mais je vais chercher un peu ou ouvrir une nouvelle discussion.
conon95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h12.


 
 
 
 
Partenaires

Hébergement Web