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

Qt Discussion :

Ajout de .lib


Sujet :

Qt

  1. #1
    Membre éclairé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut Ajout de .lib
    Bonjour

    Voici mon problème.
    J'ai un projet QT 4.4.3 sous Eclipse CDT dans lequel je souhaite ajouter une bibliothèsque statique.
    Code 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
     
    #include <string>
     
    namespace InjectCodeLib
    {
    	/*-------------------------------------------------------------------------------------------*/
    	/*
    	 *	Permet d'injecter du code dans une application déjà existante.
    	 *	(Procedure décrite dans le chapitre 22 de "Programming Applications for Microsoft Windows", de Richter)
    	 *	@param pszCalleeModName Nom de l'API dans laquelle ont souhaite intercepter une fonction.
    	 *	@param pfnCurrent Pointeur sur la fonction d'orgine.
    	 *	@param pfnNew Pointeur sur la nouvelle fonction.
    	 *	@param hmodCaller Handle sur l'application courante.
    	 */
    	/*-------------------------------------------------------------------------------------------*/
    	extern void InjectCode(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller);
     
    	/*-------------------------------------------------------------------------------------------*/
    	/*
    	 *	Permet d'injecter du code dans une application déjà existante.
    	 *	(Procedure décrite dans le chapitre 22 de "Programming Applications for Microsoft Windows", de Richter)
    	 *	@param sApiName Nom de l'API qui souhaite injecter du code.
    	 *	@param sInjectApiName Nom de l'API dans laquelle ont souhaite injecter une fonction.
    	 *	@param sFonctName Nom de la fonction que l'ont souhaite remplacer.
    	 *	@param pfnNew Adresse de la nouvelle fonction.
    	 *	@param pfnOrig Adresse de la fonction d'orgine.
    	 *	@param hmodCaller Handle sur l'application courante.
    	 */
    	/*-------------------------------------------------------------------------------------------*/
    	extern void InjectCode(const std::string sApiName, const std::string sInjectApiName, const std::string sFonctName,
    							const PROC pfnNew, PROC* pfnOrig);
    }
    (Lib compiler sous VS 2008 express)

    Donc j'ai éditer le fichier *.pro et y est ajouter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LIBS += -LD:\Eclipse_C-C++_WorkSpace\InjectCodeLib\Debug\InjectCodeLib.lib
    Ensuite j'ai inclu mon fichier InjectCodeLib.h dans mon fichier source.

    Lorsque je lance la compilation j'ai l'erreur de linkage suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    debug\WinCopier.exe debug/CHook.o debug/CThread.o debug/main.o debug/wincopier.o debug/moc_wincopier.o  -L"c:\Qt\4.4.3\lib" -lmingw32 -lqtmaind -LD:\Eclipse_C-C++_WorkSpace\InjectCodeLib\Debug\InjectCodeLib.lib -lQtGuid4 -lQtCored4
    debug/CHook.o: In function `ZN5CHook4HookEv':
    D:/Eclipse_C-C++_WorkSpace/WinCopier/CHook.cpp:76: undefined reference to `InjectCodeLib::InjectCode(std::string, std::string, std::string, int (*)(), int (**)())'
    debug/CHook.o: In function `ZN5CHook6UnHookEv':
    D:/Eclipse_C-C++_WorkSpace/WinCopier/CHook.cpp:88: undefined reference to `InjectCodeLib::InjectCode(std::string, std::string, std::string, int (*)(), int (**)())'
    Bon la je suis à cours d'idée.

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    Salut, t'es sûr de la manière dont tu l'ajoutes dans le .pro ?

    ta ligne suivante est douteuse :

    LIBS += -LD:\Eclipse_C-C++_WorkSpace\InjectCodeLib\Debug\InjectCodeLib.lib

    je ferais

    LIBS += -lnomDeLaLibSansExtension -LCheminDeCetteLib

    ce qui donnerait :

    LIBS+= -lInjectCodeLib -LD:\Eclipse_C-C++_WorkSpace\InjectCodeLib\Debug

  3. #3
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    Voilà un lien expliquant le fonctionnement de qmake.
    Dans ta configuration de visual il faut aussi ajouter le répertoire contenant ta lib dans les options de projet > Linker > search path et aussi lui specifier la lib dans les options de projet > linker > input.

  4. #4
    Membre expérimenté Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par défaut
    Après vérification, tu n'as ptêtre pas d'erreur dans ton .pro :

    LIBS

    This variable contains a list of libraries to be linked into the project. If you are more comfortable with the Unix convension of -L/-l flags you are free to use them in a cross-platform manner and qmake will do the correct thing with these libraries on Windows (namely this means passing the full path of the library to the linker). The only limitation to this is the library must exist, for qmake to find which directory a -l lib lives in.

    For example:

    unix:LIBS += -lmath -L/usr/local/lib
    win32:LIBS += c:\mylibs\math.lib

    t'as bien les *.h de la lib dans ton projet ?

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Sauf erreur, eclipse utilise... gcc comme compilateur

    Pourrais tu donc me confirmer que le compilateur utilisé pour ton projet est bel et bien celui qui a été utilisé pour compiler la bibiliothèque

    Si ce n'est pas le cas, il n'est pas impossible qu'il faille en passer par la compilation de la bibliothèque avec le même compilateur que celui qui sera utilisé pour l'application.

    En effet, il ne faut pas perdre de vue le fait que la compatibilité d'une bibliothèque statique n'est réellement assurée que... pour le compilateur qui s'est chargé de sa compilation
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre éclairé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    Oui dans mon fichier *.cpp du projet QT dans Eclipse CDT, j'ai mit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "../InjectCodeLib/InjectCodeLib/InjectCodeLib.h"
    Avec Eclipse, j'ai créer un porjet "projet C++"->"Executable"->"HelloWorld". Dans les propriétés du projet dans "C/C++ Build"->"Settings"->onglet "Tool Setting"->MinGW C++ Linker->Librairies, j'ai ajouter dans la partie -L "D:\Eclipse_C-C++_WorkSpace\InjectCodeLib\Debug" et dans la partie -l "InjectCodeLib".

    Ce qui me donne la même erreur alors je suppose que c'est soit un problème d'écriture de la lib soit un problème de paramétrage du linker, enfin la je commence à sècher.

  7. #7
    Membre éclairé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    Pour répondre à koala01:

    Effectivement Eclipse CDT utilise GCC (sous Windows j'utilise MinGW).

    Donc si je comprend bien vu que MinGw ne déclare pas DlgHelp.h et que je suis obliger d'utiliser MSVC 2008 pour ces fonctions la solution sera de créer une DLL ?

    (Je vai me coucher, j'essaye sa demain)

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Tu as très mal compris ce que je voulais dire...

    Ce que je voulais dire, c'est que, soit tu dois recompiler la bibliothèque statique avec Gcc (ou MinGW ) ou bien tu dois compiler ton projet en utilisant... le compilateur VC++, de manière à ce que le compilateur soit le même pour la bibliothèque statique et pour le projet qui utilise cette bibliothèque
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre éclairé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Tu as très mal compris ce que je voulais dire...

    Ce que je voulais dire, c'est que, soit tu dois recompiler la bibliothèque statique avec Gcc (ou MinGW ) ou bien tu dois compiler ton projet en utilisant... le compilateur VC++, de manière à ce que le compilateur soit le même pour la bibliothèque statique et pour le projet qui utilise cette bibliothèque
    J'avai compris ce que tu voulait dire. le truck c'est que je me suis mal exprimé. Ce que voulai dire c'est que je ne peut pas compiler ma bibliothèque statique sous gcc et que j'ai ne sais pas comment on fait pour utiliser QT avec VC++ donc je choisie un racourcie entre les deux. Donc je vai faire une DLL ce qui doit résoudre mon problème je pense ?

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Effectivement, le fait de compiler une bibliothèque sous la forme d'une dll permet - dans une certaine mesure - d'éviter les problèmes liés à l'incompatibilité des compilateur...

    Mais as tu seulement essayé de compiler la bibliothèque avec Gcc

    Car, malgré tout, l'utilisation d'une dll au lieu d'une bibliothèque statique implique certains procédés propres à l'utilisation d'une dll, et donc ne fait - dans une certaine mesure - que "déplacer les problèmes"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Kalite Voir le message
    que j'ai ne sais pas comment on fait pour utiliser QT avec VC++
    Fait une recherche sur le forum et regarde cutebuilder
    http://www.cutebuilder.net/french/presentation/

    Sinon, tu ne pourras pas utiliser ta lib visual avec gcc. Le problème viens du fait que tu as une dll c++. En plus en staic. Et l'interface objet est différentes suivant les compilot.

    Quoi que ta dll semble être C et C++
    Tu pourras peut être utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void InjectCode(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller);
    Malheureusement, je ne peut rien te garantir et il faut transformer ton .lib en .a (voir google). Mais je pense que tu va tu va

    Alors deux solutions :
    1- compiler ta lib avec mingw : la meilleur comme le propose koala01
    2- faire une dll avec une interface purement C avec visual. Il faut ensuite créé un .a pour que mingw puisse l'utiliser. Quoi que parfois, mingw arrive à linker sans .a s'il trouve la dll.

    Tu devrais demander conseil sur le forum C++

  12. #12
    Membre éclairé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par défaut
    Pour te répondre koala01, j'utilise une technique d'injection de DLL avec laquelle j'utilisait des foncions de DlgHelp.dll or une partie de ces fonctions ne sont pas disponible sous MinGw.
    Deplus, cette technique ne me pose un problème de deploiment car il faut installer l'outil "Debbuging Tool For Windows" afin d'obtenir DlgHelp.dll qui est nécessaire.
    Donc je suis obliger de changer de technique en utilisant CreateRemoteThread ce qui ne devrait plus me poser de problème.

    Merci.

    Merci aussi à toi Mongaulois, ca me servira si je ne peut pas compiler ma nouvelle technique avec MinGW mais sa métonnerai, enfin on sait jamais.

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

Discussions similaires

  1. Ajouter les libs externes quand on "build" le projet ?
    Par Sylver--- dans le forum NetBeans
    Réponses: 1
    Dernier message: 04/08/2007, 14h44
  2. ajout le lib dans @inc ?
    Par Billette dans le forum Modules
    Réponses: 6
    Dernier message: 19/03/2007, 10h16
  3. Comment ajouter un .lib à un projet VC++ 8 ?
    Par Jahjouh dans le forum Visual C++
    Réponses: 1
    Dernier message: 30/01/2007, 09h23
  4. [GD] Ajouter la lib GD dans PHP
    Par pyramix dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/09/2006, 13h41
  5. Code blocks ajouter un .lib
    Par gl0be dans le forum Code::Blocks
    Réponses: 7
    Dernier message: 09/09/2006, 15h04

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