IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces de programmation Oracle Discussion :

[OCILIB] Pb mise en oeuvre : symbole externe non résolu _OCI_Initialize


Sujet :

Interfaces de programmation Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	#include "ocilib.h"
    	#pragma comment(lib,"ociliba.lib")
    avant mon main, ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    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

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OCILIB] Symbole externe non résolu
    Par LeBelge63 dans le forum Interfaces de programmation
    Réponses: 8
    Dernier message: 19/06/2008, 15h04
  2. pb : symbole externe non résolu
    Par sheepman dans le forum Windows
    Réponses: 2
    Dernier message: 12/04/2007, 11h38
  3. Réponses: 3
    Dernier message: 06/08/2006, 19h17
  4. LNK2019: symbole externe non résolu __ftol2_sse
    Par ellipse dans le forum MFC
    Réponses: 1
    Dernier message: 27/04/2006, 00h48
  5. LNK2019 symbole externe non résolu
    Par devmat dans le forum MFC
    Réponses: 3
    Dernier message: 04/01/2006, 01h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo