Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème de librairie

16 réponses
Avatar
Damien
Bonjour à tous,
Je dois développer une application qui récupère les données des cartes
Vitale. Pour cela je dois utiliser la librairie api_lec.lib. Je l'ai incluse
à mon projet anisi que les headers qui étaient fournis avec. Avec ce code
tout simple :

#include <cstdlib>
#include <iostream>
#include "win32def.h"
#include "api_lec.h"
#include "api_cps.h"
#include "api_err.h"
#include "gal_err.h"
using namespace std;

int main(int argc, char *argv[])
{
unsigned short * pusMode;
unsigned short * pusCodeErreur;

cout<<"hello!\n";
Hn_Init(pusMode,pusCodeErreur);
system("PAUSE");
return EXIT_SUCCESS;
}

voici ce que le compilateur me donne :

ompilateur: Default compiler
Building Makefile: "C:\Documents and
Settings\Administrateur\Bureau\Lecole\Vitale\Makefile.win"
Exécution de make...
make.exe -f "C:\Documents and
Settings\Administrateur\Bureau\Lecole\Vitale\Makefile.win" all
g++.exe -D__DEBUG__ -c main.cpp -o
ain.o -I"lib/gcc/mingw32/3.4.2/include" -I"include/c++/3.4.2/backward" -I"include/c++/3.4.2/mingw32"
-I"include/c++/3.4.2" -I"include" -I"C:/Documents and
Settings/Administrateur/Bureau/Lecole/Vitale/include" -g3

In file included from main.cpp:6:
include/api_lec.h:162: error: `WORD' does not name a type
include/api_lec.h:163: error: `WORD' does not name a type

In file included from main.cpp:7:
include/api_cps.h:19: error: `CPS_StatusService' does not name a type
include/api_cps.h:20: error: `CPS_InfosCarte' does not name a type
include/api_cps.h:21: error: `CPS_InfosPorteur' does not name a type
include/api_cps.h:22: error: `CPS_ListeAppli' does not name a type
include/api_cps.h:23: error: `CPS_InfosFichier' does not name a type
include/api_cps.h:24: error: `CPS_InfosPS2' does not name a type

include/api_cps.h:25: error: `CPS_SituationPS' does not name a type
include/api_cps.h:26: error: `CPS_Num_ST_PS' does not name a type

make.exe: *** [main.o] Error 1

Exécution terminée

J'utilise devcpp. Quelqu'un peut-il m'aider à y voir clair?
Merci.

10 réponses

1 2
Avatar
Anthony Fleury
Bonjour à tous,


Bonjour,

Je dois développer une application qui récupère les données des cartes
Vitale. Pour cela je dois utiliser la librairie api_lec.lib. Je l'ai incluse
à mon projet anisi que les headers qui étaient fournis avec. Avec ce code
tout simple :


[...]

voici ce que le compilateur me donne :

ompilateur: Default compiler
Building Makefile: "C:Documents and
SettingsAdministrateurBureauLecoleVitaleMakefile.win"
Exécution de make...
make.exe -f "C:Documents and
SettingsAdministrateurBureauLecoleVitaleMakefile.win" all
g++.exe -D__DEBUG__ -c main.cpp -o
ain.o -I"lib/gcc/mingw32/3.4.2/include" -I"include/c++/3.4.2/backward" -I"include/c++/3.4.2/mingw32"
-I"include/c++/3.4.2" -I"include" -I"C:/Documents and
Settings/Administrateur/Bureau/Lecole/Vitale/include" -g3

In file included from main.cpp:6:
include/api_lec.h:162: error: `WORD' does not name a type
include/api_lec.h:163: error: `WORD' does not name a type

In file included from main.cpp:7:
include/api_cps.h:19: error: `CPS_StatusService' does not name a type
include/api_cps.h:20: error: `CPS_InfosCarte' does not name a type
include/api_cps.h:21: error: `CPS_InfosPorteur' does not name a type
include/api_cps.h:22: error: `CPS_ListeAppli' does not name a type
include/api_cps.h:23: error: `CPS_InfosFichier' does not name a type
include/api_cps.h:24: error: `CPS_InfosPS2' does not name a type

include/api_cps.h:25: error: `CPS_SituationPS' does not name a type
include/api_cps.h:26: error: `CPS_Num_ST_PS' does not name a type

make.exe: *** [main.o] Error 1

Exécution terminée

J'utilise devcpp. Quelqu'un peut-il m'aider à y voir clair?
Merci.


Sans en voir plus ca va pas être facile, ce sont des problèmes dans les
headers, que l'on a pas. Mais à la vue de ce type d'erreurs, je
pencherai pour une solution spécifique à cette librairie.

Il n'y a pas un exemple fourni avec ? qui dirait par exemple de définir,
à la compilation, certaines constantes pour le préprocesseur ? du genre
il faudrait définir __WIN32__, _WINDOWS, _APILECTURE_ ou quoique ce soit
d'autre ? [ donc soit avec un #define dans le fichier, soit avec
-D__WIN32__ ] ? Et si ce n'est pas ca, est ce qu'ils imposent un fichier
.h à inclure obligatoirement avant un autre ? Et dans le même genre de
solution, le compilateur ne serait-il pas appelé avec une option genre
-std=c++98 ou -ansi et qui ferait que certaines features de la librairie
serait désactivées ? Si l'on a la ligne de l'appel de g++ en entier,
rien n'y figure, sinon vérifier quand même que c'est pas le cas. Si
c'était le cas, le .h contiendrait des #ifndef STD_... ou #ifndef
STRICT_ANSI avant la définition des types qui ne sont pas trouvés (ca
c'est valable en C sous gcc, je ne sais pas si il y a des équivalents C++).

Sans voir les deux .h qui sont concernés, je penche pour ce genre de
solutions.

--
Anthony Fleury

Avatar
kanze
Anthony Fleury wrote:

Je dois développer une application qui récupère les données
des cartes Vitale. Pour cela je dois utiliser la librairie
api_lec.lib. Je l'ai incluse à mon projet anisi que les
headers qui étaient fournis avec. Avec ce code tout simple :


[...]

voici ce que le compilateur me donne :

ompilateur: Default compiler
Building Makefile: "C:Documents and
SettingsAdministrateurBureauLecoleVitaleMakefile.win"
Exécution de make...
make.exe -f "C:Documents and
SettingsAdministrateurBureauLecoleVitaleMakefile.win" all
g++.exe -D__DEBUG__ -c main.cpp -o
ain.o -I"lib/gcc/mingw32/3.4.2/include" -I"include/c++/3.4.2/backward" -I"include/c++/3.4.2/mingw32"
-I"include/c++/3.4.2" -I"include" -I"C:/Documents and
Settings/Administrateur/Bureau/Lecole/Vitale/include" -g3

In file included from main.cpp:6:
include/api_lec.h:162: error: `WORD' does not name a type
include/api_lec.h:163: error: `WORD' does not name a type

In file included from main.cpp:7:
include/api_cps.h:19: error: `CPS_StatusService' does not name a type
include/api_cps.h:20: error: `CPS_InfosCarte' does not name a type
include/api_cps.h:21: error: `CPS_InfosPorteur' does not name a type
include/api_cps.h:22: error: `CPS_ListeAppli' does not name a type
include/api_cps.h:23: error: `CPS_InfosFichier' does not name a type
include/api_cps.h:24: error: `CPS_InfosPS2' does not name a type

include/api_cps.h:25: error: `CPS_SituationPS' does not name a type
include/api_cps.h:26: error: `CPS_Num_ST_PS' does not name a type

make.exe: *** [main.o] Error 1

Exécution terminée

J'utilise devcpp. Quelqu'un peut-il m'aider à y voir clair?


Sans en voir plus ca va pas être facile, ce sont des problèmes
dans les headers, que l'on a pas. Mais à la vue de ce type
d'erreurs, je pencherai pour une solution spécifique à cette
librairie.


D'après le nom WORD, je me démande s'il ne s'attend pas à
certains en-têtes Windows, qui ne sont peut-être pas complète
sous devcpp (qui est, je crois, g++). Ou peut-être, comme tu
dis, il s'attend qu'on ait inclut l'en-tête générale de Windows
(dont je ne me souviens plus du nom) avant, chose qui est tout
naturel quand on compile avec VC++, mais pas avec g++.

De toute façon, il dit qu'on lui a fourni un .lib. Ce qui veut
dire qu'il y a du code déjà compilé. Si c'est du C++ (et non
seulement du C), il ne va pouvoir s'en servir qu'avec le même
compilateur que celui qui a servi à le générer. C-à-d
probablement VC++. Donc, même s'il résoud son problème
d'en-têtes...

--
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
Damien
Ok, je vais essayer avec le compilateur vc++ et je vous tiens au courant. Je
tiens à préciser que je ne peux pas vous en montrer plus : le code
concernant l'API ne doit pas être divulgué.
Merci pour votre aide.
Avatar
Aurelien Regat-Barrel
In file included from main.cpp:6:
include/api_lec.h:162: error: `WORD' does not name a type
include/api_lec.h:163: error: `WORD' does not name a type


WORD c'est vraiment un type de base en Win32, cette erreur est typique
de l'oublie d'inclusion de <windows.h>.
La ligne 6, c'est:
#include "api_err.h"
Je ne sais pas ce que contient ce fichier, mais apparement il repose sur
<windows.h>.
Au pire:
typedef unsigned short WORD;
(voir <windef.h> s'il y en a d'autres).
Pour les autres erreurs (CPS_StatusService...), c'est lié à ta
bibliothèque (oublie d'include, de #define, etc...).

Pour ta bibliothèque, "api_lec.lib" c'est typiquement une lib pour VC++.
Avec devcpp, ça donnerait plutot libapi_lec.a. En fait, dans le cas
d'une dll, c'est compatible et tu peux bêtement la renommer et rajouter
"-lapi_lec" dans les options de compilation.

J'utilise devcpp. Quelqu'un peut-il m'aider à y voir clair?
Merci.


Mais maintenant que VC++ 8 est dispo gratuitement dans sa version
Express, le choix de devcpp est à mon avis discutable.
Ca résoudra le problème de .lib, mais pas de compilation je pense.

--
Aurélien Regat-Barrel

Avatar
Damien
J'ai suivi vos conseils et j'ai installé Visual C++ 2005 Express Edition. Je
cherche maintenant à télécharger dynamiquement la dll : api_lec.lib. Voici
le code que je compile :

// Vitale.cpp : Defines the entry point for the console application.

#define WIN32
#define _WINDOWS
#include <Windows.h>
#include <string.h>
#include <stdio.h>
#include "win32def.h"
#include "api_lec.h"
#include "api_cps.h"
#include "api_err.h"
#include "gal_err.h"

// FCTX is a pointer to a function waiting an int, char * etc.
typedef int __stdcall (*FCTX)(unsigned short * pusMode, unsigned short *
pusCodeErreur);

// Name off the function we want to call
#define FUNCTION_NAME "Hn_Init"

// Name of the DLL to load
#define MODULE_NAME "api_lec.dll"

int main()

{
static char ModPath[255]="C:Documents and
SettingsAdministrateurBureauLecoleVitale";
int Status;
FCTX Fn_Ptr;
HMODULE ModId;
unsigned short * pusMode;
unsigned short * pusCodeErreur;
strcat(ModPath, MODULE_NAME);
ModId = LoadLibrary(ModPath);
Fn_Ptr = (FCTX)GetProcAddress(ModId, FUNCTION_NAME);
Status = Fn_Ptr(pusMode, pusCodeErreur);
FreeLibrary(ModId);
return 0;
}

Mon problème c'est qu'il ne trouve pas le fichier <windows.h>. Je sais que
le fichier se trouve à l'emplacement suivant : C:Program FilesMicrosoft
Platform SDKInclude mais je ne sais pas comment indiquer au compilateur de
rechercher dans ce répertoire.
Merci pour votre aide.
Avatar
Fabien LE LEZ
On Tue, 29 Nov 2005 11:35:54 +0100, "Damien" :

Je sais que
le fichier se trouve à l'emplacement suivant : C:Program FilesMicrosoft
Platform SDKInclude mais je ne sais pas comment indiquer au compilateur de
rechercher dans ce répertoire.


Généralement, c'est l'option -I :

le_nom_du_compilateur.exe "-IC:Program FilesMicrosoft Platform
SDKInclude" machin.cpp

Avatar
Aurelien Regat-Barrel
Mon problème c'est qu'il ne trouve pas le fichier <windows.h>. Je sais que
le fichier se trouve à l'emplacement suivant : C:Program FilesMicrosoft
Platform SDKInclude mais je ne sais pas comment indiquer au compilateur de
rechercher dans ce répertoire.


Depuis l'IDE, menu Tools->Options->Projects and Solutions->VC++
Directories->
Include files: pour les .h
Library files: pour les .lib

--
Aurélien Regat-Barrel

Avatar
Damien
J'ai reussi à inclure le windows.h mais je suis confronté à un nouveau
problème :
lorsque j'inclus un fichier fourni, il me donne ceci à la compilation

1>------ Build started: Project: Test, Configuration: Debug Win32 ------
1>Compiling...
1>Test.cpp
1>c:documents and settingsadministrateurbureaulecoletesttest.cpp(4) :
warning C4005: 'WIN32' : macro redefinition
1> command-line arguments : see previous definition of 'WIN32'
1>c:documents and settingsadministrateurbureaulecoletestwin32def.h(60)
: error C2371: 'INT8' : redefinition; different basic types
1> c:program filesmicrosoft platform sdkincludebasetsd.h(60) : see
declaration of 'INT8'
Avous-vous une idée pour résoudre mon problème?
Avatar
Aurelien Regat-Barrel
Essaye de comprendre les warnings/erreurs...
Tu définis WIN32 dans ton code, et juste après le compilo se plaint :
'WIN32' : macro redefinition
Pour l'autre erreur, même constat:
'INT8' : redefinition; different basic types

Le type INT8 est donc déclaré de manière différente dans win32def.h et
dans <windows.h>. C'est un conflit.
2 possibilités:
- c'est une erreur dans win32def.h, et alors tu supprimes/définis comme
dans windows.h
- c'est pas une erreur, on a 2 types différents avec le même nom, alors
les namespaces peuvent être une solution

--
Aurélien Regat-Barrel
Avatar
Damien
pour le type INT8 j'ai trouvé juste après avoir posté mon message:
* j'ai laissé la définition de win32def.h et j'ai mis en commentaire celle
de basetsd.h

pour win32 je peux enlever le define mais ce qui me gène c'est que la
documentation de l'API avit spécifié de l'inclure...

bon, il ne me reste plus qu'à bien utliser loadlibrary maintenant

Merci beaucoup pour votre aide.
1 2