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

C++ Discussion :

Quel type de librairie?


Sujet :

C++

  1. #1
    AkH
    AkH est déconnecté
    Membre confirmé
    Homme Profil pro
    Perso
    Inscrit en
    Juillet 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Perso

    Informations forums :
    Inscription : Juillet 2005
    Messages : 58
    Par défaut Quel type de librairie?
    Bonjour,

    Je pense que mon problème est récurent, cependant, je n'arrive pas à trouver de solutions ni de cours répondant à toutes mes questions:

    Je souhaite faire une bibliothèque de classes C++ qui seront appelées par plusieurs programmes en C++. Ces classes n'utilisent que la librairie std (vector, map, ...)

    Quelle type de DLL ou LIB dois-je utiliser?
    avec ou sans MFC?
    statique ou dynamique?

    Deuxièmement, que doivent contenir ma classe pour pouvoir être instancier correctement ?
    Je n'arrive pas à trouver de tuto qui explique comment créer une DLL et la MSDN n'indique strictement rien (à part faite nouveau projet puis DLL dans l'assistant, mdr).

    J'ai essayer de créer une DLL sans MFC et dynamique et de l'inclure dans un autre projet (dans les références), mais lors du linkage m'indique qu'il arrive pas à trouver les fonctions:

    [BuildLog.html]
    Édition des liens en cours...
    useDLL.obj : error LNK2001: symbole externe non résolu "public: __thiscall Parameter:arameter(class std::basic_string,class std::allocator >)" (??0Parameter@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
    useDLL.obj : error LNK2001: symbole externe non résolu "public: class std::basic_string,class std::allocator > __thiscall Parameter::getVersion(void)" (?getVersion@Parameter@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
    E:\Documents and Settings\AKH\Mes documents\Visual Studio 2005\Projects\useDLL\Release\useDLL.exe : fatal error LNK1120: 2 externes non résolus
    [/BuildLog.html]

    Si quelqu'un peut m'indiquer des pistes, voire me reseigner sur mon problème.

    Voici mes fichiers:

    xmldll.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    // xmldll.cpp*: définit le point d'entrée pour l'application DLL.
    //
     
    #include "stdafx.h"
    #include "Parameter.h"
     
    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif
     
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
        return TRUE;
    }
     
    #ifdef _MANAGED
    #pragma managed(pop)
    #endif
     
    Parameter *Create(std::string fileName)
    {
    	return new Parameter(fileName);
    }
     
    Parameter::Parameter(std::string fileName)
    {
    	this->_FileName = fileName;
    }
     
    Parameter::~Parameter(void)
    {
    }
     
    /*
     * Find the version number of file parameter
     *
     * Return version of file, else "none" string
     */
    std::string Parameter::getVersion(void)
    {
    	MinXL::t_xml_node *node;		// To load xml file
     
    	if(node = loadParameter())
    	{
    		node = findNode("version", node);
     
    		if(node != NULL)
    			return node->attribute_value_at(0);
    		else
    		{
    			delete node;
    			return "none";
    		}
    	}
    	delete node;
    	return "none";
    }
    ....
    Parameter.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #pragma once
    #include "xml.hpp"
     
    #ifndef _VERSION_
    #define _VERSION_ "1.0"
    #endif
     
    #ifndef _XML_PATH_
    #define _XML_PATH_ "./parametres.xml"
    #endif
     
    class Parameter
    {
    public:
    	Parameter(std::string fileName);
    	virtual ~Parameter(void);
    	virtual std::string getVersion(void);
    ...
     
    private:
    	std::string _FileName;
    ...
    );
    et le fichier qui utilise la DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    // useDLL.cpp*: définit le point d'entrée pour l'application console.
    //
     
    #include "stdafx.h"
    #include "Parameter.h"
    #include <stdlib.h>
    #include <stdio.h>
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Parameter *param = new Parameter("./parametres.xml");
    	param->getVersion();
     
    	return 0;
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    C'est bien une bibliothèque sans MFC qu'il te fallait faire.
    Quant aux projets pour faire une DLL, c'est une des limitations des versions Express de Visual (Et des projets de certains autres EDIs. Il y a certaines mauvaises pratiques dans le projet DLL de Dev-C++.

    Jette un coup d'oeil à ce thread pour les ajouts qu'il faut faire à une classe afin qu'elle soit exportée par une DLL.
    http://www.developpez.net/forums/sho....php?p=1641642

    PS: Je te conseille de faire une bibliothèque statique à la place. Surtout si tu utilises la STL. Tu te prendras moins la tête.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Bon, autrement dit tu veux un petit cours sur les bibliothèques en C++ orienté VisualC++.

    Pour l'approche généraliste:
    Les bibliothèques en C++ peuvent être compilées selon deux modes: bibliothèque statique et dynamique.
    Pour les bibliothèques statiques, un fichier xxx.lib est généré (typiquement libxxx sous linux). Ce fichier doit être utilisé par le linker pendant la création de l'exécutable (le compilateur ne l'utilise pas, par contre il doit pouvoir accéder aux headers de ta biblio). Donc dans l'ordre il faut 1- dire au compilateur où trouver les headers 2- dire au linker où trouver les librairies statiques 3- dire au linker de faire son travail en utilisant la librairie statique de ta biblio. Pour ce faire, mieux vaut aller jeter un coup d'œil aux faqs spécifiques à chaque IDE ou dans la doc de ton compilateur (c'est particulièrement dur à trouver dans visualC++).
    Pour les bibliothèques dynamiques tout ce que j'ai dit sur les biblios statiques reste vrai. Tu as aussi un fichier .lib, des headers, etc,... Mais en plus tu as un fichier .dll (.so sous linux) qui doit être accessible par l'exécutable à chaque lancement sous peine d'avoir un message d'erreur "dll xxx introuvable". A noter que le compilateur et le linker n'utilisent pas de tout cette dll.
    Aux deux possibilités de compilation précédente on peut en ajouter une troisième qui consiste tout simplement à ne rien compiler: il s'agit des bibliothèques headers only. C'est une possibilité intéressante à prendre en compte si tu fais un biblio réutilisable de taille raisonnable et avec peu de dépendances.

    Pour VisualC++:
    Cette dépendance aux dlls msvcrtxx.dll est une nuisance pour tout le monde. Je ne suis pas le mieux placé pour en parler, beaucoup de discussions ont déjà été ouvertes sur le sujet et tu n'auras pas de mal à trouver moult informations avec un peu de recherche.
    En gros d'après ce que j'ai pu en lire ici même, la moins mauvaise solution est de tout compiler avec liaison aux bibliothèques dynamiques (bref, les options de compilation par défaut). Ensuite, pour le déploiement sur l'ordinateur de tata Janine, compile ton programme/ta biblio et mode release (important, même avec un autre compilo) et exécute le programme d'installation de ces dlls qui peut être trouvé facilement sur le site de microsoft (pour info, tous les installeurs de microsoft peuvent être exécutés en mode silencieux, donc si tu crées ton propre installeur par exemple avec NSIS ou InnoSetup il n'est pas très difficile de décompresser cet exécutable puis de l'exécuter en mode silencieux, et hop, problème résolu!).
    Oui je sais ça a l'air monstrueusement chiant comme ça, mais j'ai plusieurs fois croisé des discussions de vieux briscards des MFC prônant le fait que les solutions alternatives sont encore pires.

  4. #4
    AkH
    AkH est déconnecté
    Membre confirmé
    Homme Profil pro
    Perso
    Inscrit en
    Juillet 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Perso

    Informations forums :
    Inscription : Juillet 2005
    Messages : 58
    Par défaut
    Médinoc,

    j'ai essayé de suivre le lien que tu m'a indiqué mais j'ai toujours mes problèmes au moment de l'édition des liens du projet qui utilise la lib.

    J'ai bien mis l'option dans les préprocesseur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /Od /I "..\Lib" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "BUILDING_PARAMETERLIB" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MTd /Yu"stdafx.h" /Fp"Debug\essaiXML.pch" /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt
    et voici mes options de linkage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /OUT:"E:\Documents and Settings\AKH\Mes documents\Visual Studio 2005\Projects\essaiXML\Debug\essaiXML.exe" /INCREMENTAL /NOLOGO /LIBPATH:"..\Lib" /MANIFEST /MANIFESTFILE:"Debug\essaiXML.exe.intermediate.manifest" /DEBUG /PDB:"e:\Documents and Settings\AKH\Mes documents\Visual Studio 2005\Projects\essaiXML\debug\essaiXML.pdb" /SUBSYSTEM:CONSOLE /MACHINE:X86 /ERRORREPORT:PROMPT parameter.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
    Mes fichier pour la lib:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    /*
    ParameterLib.h
    */
    #ifndef H_PARAMETERLIB
    #define H_PARAMETERLIB
     
    /* extern "C" : Pour les fonctions C et C++ accessibles dans les deux langages */
    #ifndef EXTERN_C
    #ifdef __cplusplus
    #define EXTERN_C extern "C"
    #else
    #define EXTERN_C extern
    #endif
    #endif
     
    /* NOMDELADLL_API : Pour dllimport/export */
    #ifdef BUILDING_PARAMETERLIB
    #define PARAMETERLIB_API __declspec(dllexport)
    #else
    #define PARAMETERLIB_API __declspec(dllimport)
    #endif
     
    #endif /* ! H_PARAMETERLIB */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    #ifndef __cplusplus
    #error This file is for C++ only
    #endif
     
    #ifndef PARAMETER_H_
    #define PARAMETER_H_
    #endif
     
    #ifndef _VERSION_
    #define _VERSION_ "1.0"
    #endif
     
    #ifndef _XML_PATH_
    #define _XML_PATH_ "./parametres.xml"
    #endif
     
    #pragma once
    #include "ParameterLib.h"
    #include "xml.hpp"
     
    class PARAMETERLIB_API Parameter
    {
    public:
    	Parameter(std::string fileName);
    	~Parameter(void);
    	std::string getVersion(void);
    	void Parameter::setVersion(std::string v);
    	std::string getInstallPath(void);
    	void Parameter::setInstallPath(std::string p);
    	std::string getProgramName(void);
    	void Parameter::setProgramName(std::string n);
    	std::string getUserType(void);
    	void Parameter::setUserType(std::string t);
    	std::string getModifDate(void);
    	void Parameter::setModifDate(std::string d);
    	std::string getEthernetCardName(void);
    	void Parameter::setEthernetCardName(std::string n);
    	void Parameter::setEthernetCardDescription(std::string d);
    	std::string getEthernetCardDescription(void);
     
    private:
    	std::string _FileName;
     
    	MinXL::t_xml_node *loadParameter(void);
    	MinXL::t_xml_node *findNode(std::string nodeName,MinXL::t_xml_node *node);
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
     
    #include "StdAfx.h"
    #include "Parameter.h"
     
    Parameter *Create(std::string fileName)
    {
    	return new Parameter(fileName);
    }
     
    Parameter::Parameter(std::string fileName)
    {
    	this->_FileName = fileName;
    }
     
    Parameter::~Parameter(void)
    {
    }
     
    /*
     * Find the version number of file parameter
     *
     * Return version of file, else "none" string
     */
    std::string Parameter::getVersion(void)
    {
    	MinXL::t_xml_node *node;		// To load xml file
     
    	if(node = loadParameter())
    	{
    		node = findNode("version", node);
     
    		if(node != NULL)
    			return node->attribute_value_at(0);
    		else
    		{
    			delete node;
    			return "none";
    		}
    	}
    	delete node;
    	return "none";
    }
     
    /*
     * Put the version number of file parameter
     */
    void Parameter::setVersion(std::string v)
    {
    	MinXL::t_xml_node *node = NULL;
    	MinXL::t_xml_node *nodeVersion = NULL;
    	MinXL::t_xml_node *nodeNewVersion = NULL;
     
    	if(node = loadParameter())
    	{
    		nodeVersion = findNode("version", node);
     
    		if(nodeVersion != NULL)
    		{
    			node->remove_child("version");
    			nodeNewVersion = new MinXL::t_xml_node("version");
    			nodeNewVersion->insert_attribute("num", v);
    			node->insert_child(*nodeNewVersion);
    		}
    		else
    		{
    			nodeNewVersion = new MinXL::t_xml_node("version");
    			nodeNewVersion->insert_attribute("num", v);
    			node->insert_child(*nodeNewVersion);
    		}
    	}
    	node->build_to_file(_XML_PATH_);
    	if(node != NULL) delete node;
    	if(nodeNewVersion != NULL) delete nodeNewVersion;
    }
     
    /*
     * Find the install path
     *
     * Return install path, else "none" string
     */
    std::string Parameter::getInstallPath(void)
    {
    	MinXL::t_xml_node *node;		// To load xml file
     
    	if(node = loadParameter())
    	{
    		node = findNode("install", node);
     
    		if(node != NULL)
    			return node->attribute_value_at(0);
    		else
    		{
    			delete node;
    			return "none";
    		}
    	}
    	delete node;
    	return "none";
    }
     
    /*
     * Put the install path
     *
     */
    void Parameter::setInstallPath(std::string p)
    {
    	MinXL::t_xml_node *node = NULL;
    	MinXL::t_xml_node *nodeInstall = NULL;
    	MinXL::t_xml_node *nodeNewInstall = NULL;
     
    	if(node = loadParameter())
    	{
    		nodeInstall = findNode("install", node);
     
    		if(nodeInstall != NULL)
    		{
    			node->remove_child("install");
    			nodeNewInstall = new MinXL::t_xml_node("install");
    			nodeNewInstall->insert_attribute("path", p);
    			node->insert_child(*nodeNewInstall);
    		}
    		else
    		{
    			nodeNewInstall = new MinXL::t_xml_node("install");
    			nodeNewInstall->insert_attribute("path", p);
    			node->insert_child(*nodeNewInstall);
    		}
    	}
    	node->build_to_file(_XML_PATH_);
    	if(node != NULL) delete node;
    	if(nodeNewInstall != NULL) delete nodeNewInstall;
    }
     
    /*
     * Find the program name
     *
     * Return program name, else "none" string
     */
    std::string Parameter::getProgramName(void)
    {
    	MinXL::t_xml_node *node;		// To load xml file
     
    	if(node = loadParameter())
    	{
    		node = findNode("program", node);
     
    		if(node != NULL)
    			return node->attribute_value_at(0);
    		else
    		{
    			delete node;
    			return "none";
    		}
    	}
    	delete node;
    	return "none";
    }
     
    /*
     * Put the program name
     *
     */
    void Parameter::setProgramName(std::string n)
    {
    	MinXL::t_xml_node *node = NULL;
    	MinXL::t_xml_node *nodeProgram = NULL;
    	MinXL::t_xml_node *nodeNewProgram = NULL;
     
    	if(node = loadParameter())
    	{
    		nodeProgram = findNode("program", node);
     
    		if(nodeProgram != NULL)
    		{
    			node->remove_child("program");
    			nodeNewProgram = new MinXL::t_xml_node("program");
    			nodeNewProgram->insert_attribute("name", n);
    			node->insert_child(*nodeNewProgram);
    		}
    		else
    		{
    			nodeNewProgram = new MinXL::t_xml_node("program");
    			nodeNewProgram->insert_attribute("name", n);
    			node->insert_child(*nodeNewProgram);
    		}
    	}
    	node->build_to_file(_XML_PATH_);
    	if(node != NULL) delete node;
    	if(nodeNewProgram != NULL) delete nodeNewProgram;
    }
    /*
     * Find the user type
     *
     * Return user type, else "none" string
     */
    std::string Parameter::getUserType(void)
    {
    	MinXL::t_xml_node *node;		// To load xml file
     
    	if(node = loadParameter())
    	{
    		node = findNode("user", node);
     
    		if(node != NULL)
    			return node->attribute_value_at(0);
    		else
    		{
    			delete node;
    			return "none";
    		}
    	}
    	delete node;
    	return "none";
    }
     
    /*
     * Put the user type
     *
     */
    void Parameter::setUserType(std::string t)
    {
    	MinXL::t_xml_node *node = NULL;
    	MinXL::t_xml_node *nodeUser = NULL;
    	MinXL::t_xml_node *nodeNewUser = NULL;
     
    	if(node = loadParameter())
    	{
    		nodeUser = findNode("user", node);
     
    		if(nodeUser != NULL)
    		{
    			node->remove_child("user");
    			nodeNewUser = new MinXL::t_xml_node("user");
    			nodeNewUser->insert_attribute("type", t);
    			node->insert_child(*nodeNewUser);
    		}
    		else
    		{
    			nodeNewUser = new MinXL::t_xml_node("user");
    			nodeNewUser->insert_attribute("type", t);
    			node->insert_child(*nodeNewUser);
    		}
    	}
    	node->build_to_file(_XML_PATH_);
    	if(node != NULL) delete node;
    	if(nodeNewUser != NULL) delete nodeNewUser;
    }
    /*
     * Find the date of last mofdification
     *
     * Return date, else "none" string
     */
    std::string Parameter::getModifDate(void)
    {
    	MinXL::t_xml_node *node;		// To load xml file
     
    	if(node = loadParameter())
    	{
    		node = findNode("modif", node);
     
    		if(node != NULL)
    			return node->attribute_value_at(0);
    		else
    		{
    			delete node;
    			return "none";
    		}
    	}
    	delete node;
    	return "none";
    }
     
    /*
     * Put the date of modification
     *
     */
    void Parameter::setModifDate(std::string d)
    {
    	MinXL::t_xml_node *node = NULL;
    	MinXL::t_xml_node *nodeDate = NULL;
    	MinXL::t_xml_node *nodeNewDate = NULL;
     
    	if(node = loadParameter())
    	{
    		nodeDate = findNode("modif", node);
     
    		if(nodeDate != NULL)
    		{
    			node->remove_child("modif");
    			nodeNewDate = new MinXL::t_xml_node("modif");
    			nodeNewDate->insert_attribute("date", d);
    			node->insert_child(*nodeNewDate);
    		}
    		else
    		{
    			nodeNewDate = new MinXL::t_xml_node("modif");
    			nodeNewDate->insert_attribute("date", d);
    			node->insert_child(*nodeNewDate);
    		}
    	}
    	node->build_to_file(_XML_PATH_);
    	if(node != NULL) delete node;
    	if(nodeNewDate != NULL) delete nodeNewDate;
    }
    /*
     * Find the name of ethernet card
     *
     * Return name, else "none" string
     */
    std::string Parameter::getEthernetCardName(void)
    {
    	MinXL::t_xml_node *node;		// To load xml file
     
    	if(node = loadParameter())
    	{
    		node = findNode("ethernet_card", node);
     
    		if(node != NULL)
    			return node->child_at(0).attribute_value_at(0);
    		else
    		{
    			delete node;
    			return "none";
    		}
    	}
    	delete node;
    	return "none";
    }
     
    /*
     * Put the name of the ethernet card
     */
    void Parameter::setEthernetCardName(std::string n)
    {
    	MinXL::t_xml_node *node = NULL;
    	MinXL::t_xml_node *nodeCard = NULL;
    	MinXL::t_xml_node *nodeNewCard = NULL;
     
    	MinXL::t_xml_node *nodeCardName = NULL;
    	MinXL::t_xml_node *nodeCardDescription = NULL;
     
    	MinXL::t_xml_node *ethernetCard = new MinXL::t_xml_node("ethernet_card");
     
    	if(node = loadParameter())
    	{
    		nodeCard = findNode("ethernet_card", node);
     
    		if(nodeCard != NULL)
    		{
    			nodeCardName = new MinXL::t_xml_node("name");
    			nodeCardName->insert_attribute(nodeCard->child_at(0).attribute_at(0).c_str()
    				,nodeCard->child_at(0).attribute_value_at(0).c_str());
     
    			nodeCardDescription = new MinXL::t_xml_node("name");
    			nodeCardDescription->insert_attribute(nodeCard->child_at(1).attribute_at(0).c_str()
    				,nodeCard->child_at(1).attribute_value_at(0).c_str());
     
    			node->remove_child("ethernet_card");
     
    			nodeNewCard = new MinXL::t_xml_node("name");
    			nodeNewCard->insert_attribute("value", n);
     
    			ethernetCard->insert_child(*nodeNewCard);
    			ethernetCard->insert_child(*nodeCardDescription);
    			node->insert_child(*ethernetCard);
    		}
    		else
    		{
    			nodeNewCard = new MinXL::t_xml_node("name");
    			nodeNewCard->insert_attribute("value", n);
     
    			ethernetCard->insert_child(*nodeNewCard);
    			ethernetCard->insert_child(*nodeCardDescription);
    			node->insert_child(*ethernetCard);
    		}
    	}
    	node->build_to_file(_XML_PATH_);
    	if(node != NULL) delete node;
    	if(nodeNewCard != NULL) delete nodeNewCard;
    	if(ethernetCard != NULL) delete ethernetCard;
    }
    /*
     * Find the description of ethernet card
     *
     * Return description, else "none" string
     */
    std::string Parameter::getEthernetCardDescription(void)
    {
    	MinXL::t_xml_node *node;		// To load xml file
     
    	if(node = loadParameter())
    	{
    		node = findNode("ethernet_card", node);
     
    		if(node != NULL)
    			return node->child_at(1).attribute_value_at(0);
    		else
    		{
    			delete node;
    			return "none";
    		}
    	}
    	delete node;
    	return "none";
    }
     
     
    /*
     * Put the desription of the ethernet card
     */
    void Parameter::setEthernetCardDescription(std::string d)
    {
    	MinXL::t_xml_node *node = NULL;
    	MinXL::t_xml_node *nodeCard = NULL;
    	MinXL::t_xml_node *nodeNewCard = NULL;
     
    	MinXL::t_xml_node *nodeCardName = NULL;
    	MinXL::t_xml_node *nodeCardDescription = NULL;
     
    	MinXL::t_xml_node *ethernetCard = new MinXL::t_xml_node("ethernet_card");
     
    	if(node = loadParameter())
    	{
    		nodeCard = findNode("ethernet_card", node);
     
    		if(nodeCard != NULL)
    		{
    			nodeCardName = new MinXL::t_xml_node("name");
    			nodeCardName->insert_attribute(nodeCard->child_at(0).attribute_at(0).c_str()
    				,nodeCard->child_at(0).attribute_value_at(0).c_str());
     
    			nodeCardDescription = new MinXL::t_xml_node("name");
    			nodeCardDescription->insert_attribute(nodeCard->child_at(1).attribute_at(0).c_str()
    				,nodeCard->child_at(1).attribute_value_at(0).c_str());
     
    			node->remove_child("ethernet_card");
     
    			nodeNewCard = new MinXL::t_xml_node("description");
    			nodeNewCard->insert_attribute("value", d);
     
    			ethernetCard->insert_child(*nodeCardName);
    			ethernetCard->insert_child(*nodeNewCard);
    			node->insert_child(*ethernetCard);
    		}
    		else
    		{
    			nodeNewCard = new MinXL::t_xml_node("description");
    			nodeNewCard->insert_attribute("value", d);
     
    			ethernetCard->insert_child(*nodeCardName);
    			ethernetCard->insert_child(*nodeNewCard);
    			node->insert_child(*ethernetCard);
    		}
    	}
    	node->build_to_file(_XML_PATH_);
    	if(node != NULL) delete node;
    	if(nodeNewCard != NULL) delete nodeNewCard;
    	if(ethernetCard != NULL) delete ethernetCard;
    }
    /*
     * Load parameters from fileName file.
     * If fileName file doesn't exit, return NULL
     * else return a t_xml_node type
     */
    MinXL::t_xml_node *Parameter::loadParameter(void)
    {
    	MinXL::t_xml_node *node = new MinXL::t_xml_node();		// To load xml file
    	FILE *entree;			// To test the existance of the file
     
    	if(fopen_s(&entree, this->_FileName.c_str(), "r"))
    		return (MinXL::t_xml_node*)NULL;
    	fclose(entree);
     
    	node->parse_from_file(this->_FileName.c_str());
     
    	return node;
    }
     
    /*
     * Permit to find a node whom the key is "nodeName" and return it
     *
     * Else, return NULL
     */
    MinXL::t_xml_node *Parameter::findNode(std::string nodeName, MinXL::t_xml_node *node)
    {
    	// on parcours tout les noeuds
    	for(int i = 0; i < node->nb_children(); i++)
    	{
    		// Si c'est le bon noeud
    		if(strcmp(node->child_at(i).key().c_str(), nodeName.c_str()) == 0)
    			return &node->child_at(i);
    		// Sinon on regarde ces fils
    		else
    			findNode(nodeName, &node->child_at(i));
    	}
     
    	return (MinXL::t_xml_node*)NULL;
    }
    et celui du projet qui se sert de la lib:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    // essaiXML.cpp*: définit le point d'entrée pour l'application console.
    //
     
    #include "stdafx.h"
    #include "Parameter.h"
     
    using namespace MinXL;
     
    t_xml_node loadParameter(void);
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Parameter *parameter = new Parameter("./parametres.xml");
     
    	puts(parameter->getVersion().c_str());
    	parameter->setVersion("1.5");
    	puts(parameter->getVersion().c_str());
     
    	puts(parameter->getInstallPath().c_str());
    	std::string tempPath = parameter->getInstallPath();
    	tempPath += "lol";
    	parameter->setInstallPath(tempPath);
     
    	puts(parameter->getProgramName().c_str());
    	std::string tempProgram = parameter->getProgramName();
    	tempProgram += "lol";
    	parameter->setProgramName(tempProgram);
     
    	puts(parameter->getUserType().c_str());
    	std::string tempUser = parameter->getUserType();
    	tempUser += "lol";
    	parameter->setUserType(tempUser);
     
    	puts(parameter->getModifDate().c_str());
    	std::string tempDate = parameter->getModifDate();
    	tempDate += "lol";
    	parameter->setModifDate(tempDate);
     
    	puts(parameter->getEthernetCardName().c_str());
    	std::string tempName = parameter->getEthernetCardName();
    	tempName += "lol";
    	parameter->setEthernetCardName(tempName);
     
    	puts(parameter->getEthernetCardDescription().c_str());
    	std::string tempDescr = parameter->getEthernetCardDescription();
    	tempDescr += "lol";
    	parameter->setEthernetCardDescription(tempDescr);
     
    	system("PAUSE");
    	return 0;
    }
    j'ai bien mis le path pour aller chercher la lib, mais voici la sortie de l'édition de lien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    Édition des liens en cours...
    parameter.lib(Parameter.obj) : .netmodule ou module MSIL compilé avec /GL trouvé ; redémarrage de l'édition de liens avec /LTCG ; ajoutez /LTCG à la ligne de commande de l'édition de liens pour améliorer les performances de l'Éditeur de liens
    LINK : warning LNK4075: ' /INCREMENTAL' ignoré à cause de la spécification '/LTCG'
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string,class std::allocator >::basic_string,class std::allocator >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) déjà défini(e) dans essaiXML.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "protected: char const * __thiscall std::basic_string,class std::allocator >::_Myptr(void)const " (?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IBEPBDXZ) déjà défini(e) dans essaiXML.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: char const * __thiscall std::basic_string,class std::allocator >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) déjà défini(e) dans essaiXML.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string,class std::allocator >::~basic_string,class std::allocator >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) déjà défini(e) dans essaiXML.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string,class std::allocator >::basic_string,class std::allocator >(class std::basic_string,class std::allocator > const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z) déjà défini(e) dans essaiXML.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "protected: char * __thiscall std::basic_string,class std::allocator >::_Myptr(void)" (?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEPADXZ) déjà défini(e) dans essaiXML.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits::length(char const *)" (?length@?$char_traits@D@std@@SAIPBD@Z) déjà défini(e) dans essaiXML.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: unsigned int __thiscall std::basic_string,class std::allocator >::size(void)const " (?size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ) déjà défini(e) dans essaiXML.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_string,class std::allocator > & __thiscall std::basic_string,class std::allocator >::erase(unsigned int,unsigned int)" (?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@II@Z) déjà défini(e) dans essaiXML.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_string,class std::allocator > & __thiscall std::basic_string,class std::allocator >::operator+=(char const *)" (??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z) déjà défini(e) dans essaiXML.obj
    MSVCRT.lib(MSVCR80.dll) : error LNK2005: _fclose déjà défini(e) dans LIBCMTD.lib(fclose.obj)
    MSVCRT.lib(MSVCR80.dll) : error LNK2005: "public: __thiscall std::exception::exception(class std::exception const &)" (??0exception@std@@QAE@ABV01@@Z) déjà défini(e) dans LIBCMTD.lib(stdexcpt.obj)
    MSVCRT.lib(MSVCR80.dll) : error LNK2005: _memmove_s déjà défini(e) dans LIBCMTD.lib(memmove_s.obj)
    MSVCRT.lib(MSVCR80.dll) : error LNK2005: _atoi déjà défini(e) dans LIBCMTD.lib(atox.obj)
    MSVCRT.lib(MSVCR80.dll) : error LNK2005: "public: __thiscall std::exception::exception(char const * const &)" (??0exception@std@@QAE@ABQBD@Z) déjà défini(e) dans LIBCMTD.lib(stdexcpt.obj)
    MSVCRT.lib(MSVCR80.dll) : error LNK2005: "public: virtual __thiscall std::exception::~exception(void)" (??1exception@std@@UAE@XZ) déjà défini(e) dans LIBCMTD.lib(stdexcpt.obj)
    MSVCRT.lib(MSVCR80.dll) : error LNK2005: "public: virtual char const * __thiscall std::exception::what(void)const " (?what@exception@std@@UBEPBDXZ) déjà défini(e) dans LIBCMTD.lib(stdexcpt.obj)
    MSVCRT.lib(MSVCR80.dll) : error LNK2005: "public: __thiscall std::exception::exception(void)" (??0exception@std@@QAE@XZ) déjà défini(e) dans LIBCMTD.lib(stdexcpt.obj)
    MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) déjà défini(e) dans LIBCMTD.lib(typinfo.obj)
    MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) déjà défini(e) dans LIBCMTD.lib(typinfo.obj)
       Création de la bibliothèque E:\Documents and Settings\AKH\Mes documents\Visual Studio 2005\Projects\essaiXML\Debug\essaiXML.lib et de l'objet E:\Documents and Settings\AKH\Mes documents\Visual Studio 2005\Projects\essaiXML\Debug\essaiXML.exp
    LINK : warning LNK4098: conflit entre la bibliothèque par défaut 'MSVCRT' et les autres bibliothèques ; utilisez /NODEFAULTLIB:library
    E:\Documents and Settings\AKH\Mes documents\Visual Studio 2005\Projects\essaiXML\Debug\essaiXML.exe : fatal error LNK1169: un ou plusieurs symboles définis à différentes reprises ont été rencontrés

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Y'a comme un problème, là: Il y a au moins un truc que tu as compilé en /clr alors que tu n'aurais pas du. Ou bien, c'est juste le warning qui dit ça et tu as activé la "whole program optimization" avant l'heure, mais si tu compiles en mode Debug, j'en doute...

    De plus, l'option /D "BUILDING_PARAMETERLIB" doit être uniquement dans le projet de la DLL, pas celui de l'exe.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    AkH
    AkH est déconnecté
    Membre confirmé
    Homme Profil pro
    Perso
    Inscrit en
    Juillet 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Perso

    Informations forums :
    Inscription : Juillet 2005
    Messages : 58
    Par défaut
    arf toujours pas même avec le changement que tu m'as indiqué.

    je met mes options de compil et link des deux projets si ca peut aider:

    projet DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /O2 /GL /D "WIN32" /D "NDEBUG" /D "_LIB" /D "BUILDING_PARAMETERLIB" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Yu"stdafx.h" /Fp"Release\parameter.pch" /Fo"Release\\" /Fd"Release\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /OUT:"E:\Documents and Settings\AKH\Mes documents\Visual Studio 2005\Projects\parameter\Release\parameter.lib" /NOLOGO /LTCG
    projet utilisation de la DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /Od /D "WIN32" /D "_DEBUG" /D "_CONSOL" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MTd /Yu"stdafx.h" /Fp"Debug\essaiXML.pch" /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /OUT:"E:\Documents and Settings\AKH\Mes documents\Visual Studio 2005\Projects\essaiXML\Debug\essaiXML.exe" /INCREMENTAL /NOLOGO /LIBPATH:"..\Lib" /MANIFEST /MANIFESTFILE:"Debug\essaiXML.exe.intermediate.manifest" /DEBUG /PDB:"e:\Documents and Settings\AKH\Mes documents\Visual Studio 2005\Projects\essaiXML\debug\essaiXML.pdb" /SUBSYSTEM:CONSOLE /MACHINE:X86 /ERRORREPORT:PROMPT parameter.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Je pense qu'il est un peu tôt pour mélanger les torchons et les serviettes.
    Compile ta DLL en mode Debug, on verra ensuite si on peut mélanger.

    Edit: Euh... Cette commande d'édition de liens, elle n'est pas pour une DLL, mais pour une lib statique...
    Il faudrait savoir ce que tu fais...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    AkH
    AkH est déconnecté
    Membre confirmé
    Homme Profil pro
    Perso
    Inscrit en
    Juillet 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Perso

    Informations forums :
    Inscription : Juillet 2005
    Messages : 58
    Par défaut
    hum j'ai recompiler la lib en mode debug et enlevé le /GL (mis automatiquement pas VS .NET 2K5) mais toujours mes erreurs de link.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    J'ai édité mon message depuis. Si c'est bien une bibliothèque statique que tu veux faire, je dois t'avouer que je ne les connais que peu.

    Généralement, je fais plutôt des bibliothèques dynamiques qui n'exposent que des fonctions C et des objets COM...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    AkH
    AkH est déconnecté
    Membre confirmé
    Homme Profil pro
    Perso
    Inscrit en
    Juillet 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Perso

    Informations forums :
    Inscription : Juillet 2005
    Messages : 58
    Par défaut
    et moi qui ne voulais faire qu'une lib de classes

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Peut-être que d'autres s'y connaissent mieux que moi.

    Je sais que ce n'est pas évident sous les versions Express de Visual, de faire autre chose qu'un projet dédié au Framework .Net.
    Et d'ailleurs, même sur ma version étudiante, je n'ai pas encore vraiment fait de projet lib statique, et encore moins en C++...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    AkH
    AkH est déconnecté
    Membre confirmé
    Homme Profil pro
    Perso
    Inscrit en
    Juillet 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Perso

    Informations forums :
    Inscription : Juillet 2005
    Messages : 58
    Par défaut
    je possède une version "Visual Sutdio 2005 Pro" (grâce au programme microsoft alliance et blablabla) mais comme tu vois c'est le bordel

  13. #13
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LINK : warning LNK4075: ' /INCREMENTAL' ignoré à cause de la spécification '/LTCG'
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string,class std::allocator >::basic_string,class std::allocator >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) déjà défini(e) dans essaiXML.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "protected: char const * __thiscall std::basic_string,class std::allocator >::_Myptr(void)const " (?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IBEPBDXZ) déjà défini(e) dans essaiXML.obj
    msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: char const * __thiscall std::basic_string,class std::allocator >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) déjà défini(e) dans essaiXML.obj
    ...
    Ce message d'erreur intervient généralement lorsque tu utilises différents memory pool de la CRT (à vérifier...).

    En tout cas change ton projet utilisant la lib pour MD(release) et MDd(debug). Sous visual 2005, ce paramètre est présent dans "C/C++" => "Génération de code" => "Bibliothèque runtime"

    D'après les paramètres de ta lib c'est déjà en MD/MDd donc pas de problème. Pour commencer essayer de compiler SEULEMENT en debug (d'après les paramètres envoyé tu as MD(qui correspond généralement au mode release) pour ta lib et MTd(debug) pour le projet l'utilisant donc c'est vraiment pas bon

    EDIT : griller trois fois le temps d'écrire mon message
    et moi qui ne voulais faire qu'une lib de classes
    Ne désespère pas c'est seulement une question de configuration

  14. #14
    AkH
    AkH est déconnecté
    Membre confirmé
    Homme Profil pro
    Perso
    Inscrit en
    Juillet 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Perso

    Informations forums :
    Inscription : Juillet 2005
    Messages : 58
    Par défaut
    et dire qu'il fallait juste changer /MtD par /MD et hop ca marche

    merci a vous tous pour votre aide.

    Pas si simple l'utilisation d'une DLL

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    À mon avis, il fallait plutôt changer:
    • /MTd par /MDd
    • /MT par /MD

    Non?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    À mon avis, il fallait plutôt changer:

    * /MTd par /MDd
    * /MT par /MD
    En effet c'est plutôt conseillé d'utiliser MTd ou MDd pour le mode debug puisque c'est prévu pour, je suppose qu'on s'expose encore à des erreurs de link() si on ne respecte pas la règle mais...c'est qu'une supposition.

  17. #17
    AkH
    AkH est déconnecté
    Membre confirmé
    Homme Profil pro
    Perso
    Inscrit en
    Juillet 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Perso

    Informations forums :
    Inscription : Juillet 2005
    Messages : 58
    Par défaut
    je ne suis pas un expert des options de link de VC, qui pour moi sont trop complexe et peu (voir pas) documentées.

    onc mon *.lib marche bien avec mon projet (si compilé en mode débug) mais je me pose la question suivante:

    Si je viens à ajouter, ou modifier des fonction dans mon *.lib, je vais devoir recompiler tous mes projets qui vont s'en servir car le code se trouvant dans le *.lib et inclut dans les .exe des projets.

    N'est-il pas mieux de faire une DLL ? ou j'aurais juste à copier la nouvelle DLL avec le .exe ?

  18. #18
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Si je viens à ajouter, ou modifier des fonction dans mon *.lib, je vais devoir recompiler tous mes projets qui vont s'en servir car le code se trouvant dans le *.lib et inclut dans les .exe des projets.

    N'est-il pas mieux de faire une DLL ? ou j'aurais juste à copier la nouvelle DLL avec le .exe ?
    En effet le code devra être recompilé si tu modifie ta lib l'avantage peut être la détection d'erreur dans ta librairie statique par le compilateur contre un "méchant" crash à l'exécution pour une dll (et bien sur il faut trouver l'erreur après)
    Maintenant pour les raisons que tu as évoquées c'est vrai que la dll est chargée à l'exécution donc pas besoin de recompiler et c'est pas négligeable...

    je ne suis pas un expert des options de link de VC, qui pour moi sont trop complexe et peu (voir pas) documentées
    La aussi tu as entièrement raison (enfin moi j'ai pas trouvé grand chose jusqu'à présent) Mais avec l'entrainement ça vient un peu

    EDIT : D'ailleurs ce n'est pas tout à fait vrai, un dll peut être également liée statiquement à un projet via (__declspec(dllimport) / __declspec(dllexport) ). Cette article pourra peut être t'aider à y voir plus clair même si c'est sous C++ Builder : http://lfe.developpez.com/DLL/

    EDIT2 : J'avais presque oublié mon post qui pourrait aussi t'aider

  19. #19
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Question conne : je me suis toujours demandé la différence entre un fichier objet et une bibliothèque statique.

    Dans les deux cas, les deux fichiers contiennent le code complet des fonctions. On peut utiliser les deux fichiers quasiment de la même façon.

  20. #20
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Une bibliothèque statique, ça me semble être juste un ensemble de fichiers objets.

    Avec un archiveur comme IZArc, tu peux carrément ouvrir un fichier .a et ça te le liste comme une archive de fichiers .o
    D'ailleurs, il me semble que le "a" de .a est l'initiale de "archive"...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/07/2014, 18h42
  2. Quels types de projets réalisez vous avec .NET
    Par Louis-Guillaume Morand dans le forum Général Dotnet
    Réponses: 106
    Dernier message: 03/12/2007, 18h44
  3. quels types de cable faut -il pour un réseau LAN
    Par oumarsaw dans le forum Développement
    Réponses: 6
    Dernier message: 25/08/2004, 13h25
  4. Quel type de projet choisir pour incorporer directX9...
    Par Coderm@n dans le forum DirectX
    Réponses: 6
    Dernier message: 02/08/2004, 13h24
  5. Quel type de BDD dans mon cas
    Par zoubidaman dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 10/06/2004, 18h00

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