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 :

Compiler libusb-win32 sous Visual C++


Sujet :

C

  1. #61
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    Je viens de tomber sur ça sur le mdn.
    Surtout sur:

    "L'appel d'une fonction C depuis un programme C++ sans utilisation de extern "C" (qui impose au compilateur d'utiliser la convention de noms C) peut causer LNK2001. Les options du compilateur /Tp et /Tc font compiler les fichiers sous forme C++ ou C, respectivement, quelle que soit l'extension du nom de fichier. Ces options peuvent causer des noms de fonctions différents de ceux attendus."


    Si un code est déjà en C et qu'il n'y a pas extern "C", vous pensez que cette erreur peut apparaître?

  2. #62
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Tu as des fichiers "uniquement" composés de C ?
    Pas de "class" ou autre ?

    Si aucun "class" ni de .cpp : alors pas besoin de "extern".
    EDIT : j'ai peut être oublié le cas des .lib

    Ce mot du langage sert en fait lors de la transformation du C++/C vers le langage intermédiaire (avant l'assembleur) : en C, un nom de fonction == une fonction, en C++ par contre, une fonction == un nom de fonction + un type de retour + des paramètres + types des paramètres.
    Le compilateur va créer des noms de fonctions "internes" contenant toutes ces informations.

    Tu te doutes "du coup", que mettre du C et du C++ va entraîner des problèmes de link : le C n'utilisera QUE le nom dans les déclarations de fonctions dans les .o, et C++ va chercher un autre nom composé des types etc... ce qui créera des "undefined reference to..."

    EDIT : là je n'ai expliqué que pour le cas C/C++, mais il y a encore plus tordu avec les conventions d'appels (en parcourant en diagonal ton lien ;P).
    En cdecl, stdcall, etc... d'autres trucs comptent : dans l'un c'est l'appelant qui pousse les arguments sur la pile, et la nettoie au retour, dans l'autre c'est l'appelé qui le fait !...
    Bref...
    Par contre j'ai un doute si on appelle depuis un .lib
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #63
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    J'ai résolu 2 erreurs de link! 2 fichiers sources qui utilisaient des mêmes noms de fonction.

    Maintenant j'ai droit à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c:\winddk\7600.16385.1\src\driver\driverbis\driverbis\install_filter_win.c(683): error C2040: 'create_tooltip'*: les niveaux d'indirection de 'HWND (HWND,HINSTANCE,UINT,create_tooltip_t *)' et de 'int ()' sont différents
    Et la fonction qui va bien:
    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
    HWND create_tooltip(HWND hMain, HINSTANCE hInstance, UINT max_tip_width, create_tooltip_t tool_tips[])
    {
    	HWND hTip;
    	TOOLINFO toolInfo = {0};
    	int i;
     
    	// Create the tooltip window
    	hTip = CreateWindowExA(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
    		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,	hMain, NULL,
    		hInstance, NULL);
     
    	if (hTip == NULL) {
    		return (HWND)NULL;
    	}
     
    	// Associate the tooltip to the control
    	toolInfo.cbSize = sizeof(toolInfo);
    	toolInfo.hwnd = hMain;
    	toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
     
    	for (i=0; tool_tips[i].controlID != 0 && tool_tips[i].message != NULL; i++)
    	{
    		toolInfo.uId =(UINT_PTR)GetDlgItem(hMain,tool_tips[i].controlID);
    		toolInfo.lpszText = (LPSTR)tool_tips[i].message;
    		SendMessage(hTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);
    	}
     
    	SendMessage(hTip, TTM_SETMAXTIPWIDTH, 0, max_tip_width);
     
    	return hTip;
    }
    J'ai été voir sur le msdn pour me renseigner un peu plus sur cette erreur mais c'est pas terrible. Et google ne m'a beaucoup aidé non plus...
    C'est une erreur dans la fonction, de l'appel de la fonction ou...??

  4. #64
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il se plaint que tu passes un pointeur vers create_tooltip() à quelque chose qui semble attendre un pointeur de fonction int func().
    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.

  5. #65
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    J'ai résolu cette erreur et quelques unes qui sont apparus après

    Mais il en reste encore, forcément!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    transfer.obj : error LNK2001: symbole externe non résolu __imp__ExFreePoolWithTag
    Une dizaine de ce type là et des erreurs LNK2019. Encore une fois je sèche...

  6. #66
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour,
    Pour un "symbole externe non résolu", il te manque encore un fichier de bibliotheque, ou un fichier d'implémentation du dit symbole.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #67
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Je plussoie leternel et j'ajouterais uniquement le résultat d'une recherche google :

    MSDN ExFreePoolWithTag

    Header : Wdm.h (include Wdm.h, Ntddk.h, or Ntifs.h)
    Library : Contained in Ntoskrnl.lib
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  8. #68
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    Ntoskrnl.lib est déjà dans le projet ("dépendance supplémentaires" toussa toussa) et j'avais déjà les #include "ntddk.h" pour chaque fichier. Dans le doute, j'ai essayé avec wdm.h mais ça ne change rien.

    Donc apparemment il ne manque rien au projet... Je vais finir par connaitre par coeur les options de Visual à force

  9. #69
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    En fouinant pour le "__imp__" je trouve ça : how-can-i-get-rid-of-the-imp-prefix-in-the-linker-in-vc

    Et d'après pas mal d'autres liens, ça vient du fait que tu essayes de linker avec un .lib dédié à une DLL, alors que tu veux linker statiquement...
    Ou quelque chose du genre dans ce genre là.
    Y a-t-il des dllimport, dlopen ou autre dans ton code ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  10. #70
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Es-tu sûr aussi qu'il n'y a qu'une seule version de ntoskrnl.lib, et non pas, par exemple, une version statique et une version dynamique?
    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.

  11. #71
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Metalman
    Et d'après pas mal d'autres liens, ça vient du fait que tu essayes de linker avec un .lib dédié à une DLL, alors que tu veux linker statiquement...
    Ou quelque chose du genre dans ce genre là.
    Y a-t-il des dllimport, dlopen ou autre dans ton code ?
    Je cherche, je cherche....

    Citation Envoyé par Médinoc
    Es-tu sûr aussi qu'il n'y a qu'une seule version de ntoskrnl.lib, et non pas, par exemple, une version statique et une version dynamique?
    Comment faire pour les différencier alors? Je les essaye un par un?

  12. #72
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    Apparemment, il n'y a qu'une seule version. Après analyse complète du disque dur, les différentes versions que je trouve sont celles qui fonctionnent avec d'autres versions de Windows.

    J'ai toujours pas trouvé de dllimport ou de dlopen...

  13. #73
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il y a sans doute un #define NTKERNELAPI __declspec(dllimport) actif quelque part dans les headers.

    Je ne connais pas assez le WDK pour savoir si c'est mauvais (si ntoskrnl.lib doit en fait être linké en statique) ou si c'est ton linkage qui n'arrive pas à lier à ntoskrnl.lib pour une raison ou une autre (/NODEFAULTLIB ?).
    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.

Discussions similaires

  1. Compilation de GEOS sous Visual C++ 2005
    Par figuralegoric dans le forum Visual C++
    Réponses: 1
    Dernier message: 15/09/2009, 21h23
  2. Recuperation date de compilation sous visual c++
    Par semenzato dans le forum MFC
    Réponses: 4
    Dernier message: 20/12/2005, 14h43
  3. Réponses: 7
    Dernier message: 27/09/2005, 21h40
  4. problème de compilation sous visual C++
    Par fabmili dans le forum MFC
    Réponses: 4
    Dernier message: 08/02/2004, 19h52

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