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

Visual C++ Discussion :

Visual C++ 2008 Express : Création d'une DLL - Problème de link


Sujet :

Visual C++

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut Visual C++ 2008 Express : Création d'une DLL - Problème de link
    Bonjour à tous,

    Etant un peu novice en programmation bas niveau, j'aurais besoin d'un petit coup de main.

    Afin de commencer un projet de développement, je dispose d'un fichier .c et des fichiers .h nécessaires pour générer une DLL (qui, par la suite, sera utilisée par le logiciel PureData). Ces fichiers ont été codés par une autre personne plusieurs années auparavant.

    J'utilise Visual C++ 2008 Express Edition. Le code dont je dispose, quant à lui, a été réalisé sous une version antérieure de Visual C++ et sous une version antérieure de Windows.

    Pour compiler j'utilise un protocole très détaillé, qui a été donné sur le topic du forum suivant (voir le cinquième message du topic) :

    http://puredata.hurleur.com/sujet-10...ternal-windows

    A noter que mon programme s'appelle M2M~.c et non helloworld.c comme dans le lien précédent. En outre, je dispose de plusieurs fichiers d'entête.

    J'arrive jusqu'à l'étape 9 du protocole : lors de la compilation j'ai une erreur au moment de l'édition des liens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1   Compilation en cours...
    2   M2M~.c
    3   Édition des liens en cours...
    4   LINK : error LNK2001: symbole externe non résolu M2M~_setup
    5   C:\Users\Teaiki\Documents\Visual Studio 2008\Projects\M2M~\Debug \M2M~.lib : fatal error LNK1120: 1 externes non résolus
    En me renseignant sur le web, j'ai cru comprendre que le compilateur n'arrive pas à faire le lien entre les différents modules du programme. Mais je ne sais pas quoi faire, c'est un peu flou pour moi.

    Je vous remercie pour toute aide éventuelle, cela me permettrait de commencer mon projet.

    Teaiki

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour et bienvenu,
    Tu as du oublié d'ajouter un fichier source à ton projet? Ou alors tu as des directives de compilation non définies?

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut
    Bonjour,

    Merci pour la réponse.

    Citation Envoyé par 3DArchi Voir le message
    Bonjour et bienvenu,
    Tu as du oublié d'ajouter un fichier source à ton projet? Ou alors tu as des directives de compilation non définies?
    En fait, j'ai ajouté tous les fichiers que l'on m'a transmis (le fichier source et les fichiers d'entête). Et le programme fonctionnait à l'époque (quand l'auteur du programme l'a écrit). Donc ça doit probablement être la seconde solution.

    Je vais quand même revérifier auprès de mon responsable qu'on m'a bien transmis tous les fichiers nécessaires.

    Si on suppose que j'ai des directives de compilation non définies, et sachant que j'ai suivi à la lettre le protocole dont j'ai donné le lien dans mon premier message, est-ce que cela voudrait dire qu'il y a des directives de compilations supplémentaires à spécifier lorsqu'on a plusieurs fichiers d'entête? Ou est-ce qu'il y a des directives de compilation supplémentaires à spécifier sur Visual C++ 2008 (le protocole est fait avec Visual C++ 2005)?

    Merci pour toute éventuelle réponse.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Une autre piste peut être que le répertoire de recherche des fichiers lib est mal renseigné et qu'il n'arrive pas à trouver le .lib.
    Pourquoi il y a des '~' dans les traces que tu envois (et spécifiquement M2M~_setup )? Peux-tu poster le .h/.c qui est supposé correspondre ?

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut
    Merci pour la réponse,

    En fait le hic, c'est qu'on m'a demandé de ne pas distribuer les fichiers qu'on m'a passé.

    Je peux néanmoins mettre une fraction du fichier .c (j'ai j'ai retiré les 900 lignes de codes restantes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "m_pd.h"
    #include "p2c.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include "nrutil.h"
    J'ai bien inclus dans le projet, les fichiers m_pd.h, p2c.h et nrutil.h en tant que fichiers d'entête.

    Sinon, j'ai remarqué que quand j'essayais de compiler avec MinGW, j'avais des "undefined reference to malloc" (ou bien fprintf, log, etc...), ce qui veut peut-être dire qu'il a un problème aussi avec les stdio.h, stdlib.h et math.h.

    Alors pour le '~', je n'ai aucune idée de pourquoi celui qui a écrit ce code l'a appelé comme ça (le fichier que j'ai récupéré s'appelle M2M~.c). Et suivant le protocole que j'ai suivi, j'ai mis bêtement "/export:M2M~_setup" dans les options supplémentaires de ligne de commande (Propriétés de M2M~->Propriétés de configuration->Editeur de liens->Lignes de commande->Options supplémentaires).

    Sinon, j'ai des questions qui peut paraître idiote : Doit-on mettre le .lib dans un répertoire particulier? Est-ce qu'il doit forcément y avoir un M2M~.lib (je n'en ai pas reçu)? Si oui, est-ce que je dois en fabriquer un à partir du code .c (et comment faire)? Ou est-ce que je suis censé l'avoir déjà disposition.

    Merci pour toute aide éventuelle.

    Teaiki

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Ce qui me gène, c'est qu'on n'est pas sensé avoir de '~' dans un nom de fonction. Au vu de ce que tu dis, ce serait alors l'option '/export:M2M~_setup' qui ne serait pas bonne. D'où est supposée venir cette méthode M2M~_setup ? Elle doit être dans un .h? Sous cette forme ?

    Pour répondre à ta question sur les .lib. (Mes remarques étaient des pistes puisque je ne connais pas ton environnement). Soit on t'a fourni que des sources, auquel cas tu les rajoutes seulement dans les fichiers à compiler ton projet. Soit on t'as fournis aussi des librairies (donc des .lib), au quel cas il faut dire à Visual de lier ton projet avec ces librairies. Mais tu semble dire que tu n'as pas de tel .lib. Ce qui indique qu'on se trouve dans la première hypothèse (que des sources). Pour info, les .lib se mettent où tu veux : ensuite soit tu mets le chemin complet dans les options du link vers la bibliothèque, soit tu spécifie dans Visual, les répertoires où chercher ces bibliothèques.

    Pour ton pb sur "undefined reference to trucmuche" : en général cela se produit dans des fichiers sources où tu utilises ces fonctions mais tu n'as pas fait l'include de l'en-tête adéquat. Ca n'est pas grave en soit, mais ça s'appelle un code mal écrit

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut
    Merci d'avoir éclairé ces points obscures pour moi,

    En fait on ne m'a pas fourni de .lib, mais en suivant le protocole que j'ai cité plus haut, j'ai été ammené à télécharger une librairie pd.lib (qui vient des créateurs du logiciel PureData et qui contient des choses utiles pour compiler des DLL pour PureData). (Excusez-moi du fait que ce soit en anglais et non en français)

    d. Tell linker where to find pd.lib:
    1. In the left pane, select Configuration Properties >> Linker >> Input.
    2. In the right pane, select Additional Dependencies and enter
    C://TEMP/pd.lib.


    Comme je suis sous Vista et non sous XP (OS du protocole que j'ai suivi) je n'ai pas de répertoire C://TEMP/. Donc j'ai mis le .lib dans un autre répertoire, mais si j'ai bien compris, cela n'a pas d'importance du moment que l'on spécifie à Visual C++ le bon répertoire où il faut aller chercher le .lib.

    Est-ce que cela pourrait vouloir dire qu'il me manque d'autres .lib dont je n'ai pas connaissance, ou que pd.lib est défaillant?

    Mon responsable vient de me faire savoir qu'il arrive à le compiler sous MacOS (sans le .lib a priori, car ce n'est pas lui qui me l'a fourni).

    Pour la methode M2M~_setup : j'ai suivi le protocole, à la lettre (dans le protocole il est question de compiler helloworld.c) :


    e. Tell linker to export the setup function:
    1. In the left pane, select
    Configuration Properties >> Linker >> Command Line.
    2. In the right pane, type
    /export:helloworld_setup in the Additional options field.
    3. Click OK.


    Pour le "undefined reference to..." : ce sont il ne trouve pas des fonctions telles que fprintf ou malloc, qui sont censées être comprises dans stdlib.h ou bien stdio.h. Et il y a bien le #include<stdlib.h> et #include<stdio.h> dans le fameux M2M~.c. Je sais pas trop ce que pourrait vouloir dire.

    Merci pour toute aide.

    Teaiki

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Hypothèse :tu as un problème de configuration des répertoires de Visual ?
    Menu Tool/Options
    Onglet Projects and Solutions / VC++ Directories
    Ensuite Show directories for -> Include files et Library files à vérifier.
    (enfin, c'est ce que j'ai comme menus pour VS Express sous XP).

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut
    Merci pour ces précisions,

    Il y a du nouveau... Comme je débute en Visual C++, je viens de remarquer, grâce au outils de VC, qu'il existe une méthode M2M_tilde_setup(void) dans le fichier M2M~.c, qui ressemble dans sa structure a la fonction helloworld_setup(void) que je viens de regarder sur le web. Donc je me suis empressé de remplacer "/export:M2M~_setup" par "/export:M2M_tilde_setup".

    Je sais pas si c'est mieux mais j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Édition des liens en cours...
       Création de la bibliothèque C:\Users\Teaiki\Documents\Visual Studio 2008\Projects\M2M~\Debug\M2M~.lib et de l'objet C:\Users\Teaiki\Documents\Visual Studio 2008\Projects\M2M~\Debug\M2M~.exp
    M2M~.obj : error LNK2001: symbole externe non résolu _s_signal
    C:\Users\Teaiki\Documents\Visual Studio 2008\Projects\M2M~\Debug\M2M~.dll : fatal error LNK1120: 1 externes non résolus
    Apparement il y a encore un problème de link, concernant une méthode "_s_signal" que je n'arrive pas à trouver dans le code (ctrl+f).

    Pourtant ce même code fonctionne sur MacOS...

    Je viens également de vérifier les Include files et Library files comme vous me l'aviez suggéré et j'ai :

    pour les Include files:

    $(VCInstallDir)include
    $(VCInstallDir)atlmfc\include
    $(WindowsSdkDir)\include
    $(FrameworkSDKDir)include


    pour les Library files

    $(VCInstallDir)lib
    $(VCInstallDir)atlmfc\lib
    $(VCInstallDir)atlmfc\lib\i386
    $(WindowsSdkDir)\lib
    $(FrameworkSDKDir)lib
    $(VSInstallDir)
    $(VSInstallDir)lib


    Est-ce que je suis censé retrouver les .h et .lib spécifiques au M2M~.c?

    Merci pour toute aide.

    Teaiki

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par teaiki Voir le message
    Apparement il y a encore un problème de link, concernant une méthode "_s_signal" que je n'arrive pas à trouver dans le code (ctrl+f).
    Pourtant elle doit être quelque part car ce n'est pas la signature standard de signal ?
    Citation Envoyé par teaiki Voir le message
    Est-ce que je suis censé retrouver les .h et .lib spécifiques au M2M~.c?
    Les .h s'ils sont à la racine du projet (ou inclus via un chemin relatif), non.
    Les .lib, il me semble que tu m'as dit qu'il n'y en avait pas. Sinon, il faut mettre le chemin qui permet d'y accéder en fonction de ce qui est mis dans les options de link comme bibliothèque supplémentaire.

  11. #11
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut
    Bonjour,

    Merci pour tes réponses.

    En fait c'est quoi la signature standard de signal? J'ai essayé de me renseigner sur le web mais j'ai pas trouvé.

    Merci pour toute aide.

    Teaiki

Discussions similaires

  1. Réponses: 8
    Dernier message: 27/07/2012, 14h59
  2. Réponses: 4
    Dernier message: 02/11/2009, 16h49
  3. Faire une belle interface avec MS Visual C# 2008 express
    Par pdtor dans le forum Windows Forms
    Réponses: 4
    Dernier message: 15/04/2009, 14h08
  4. Affichage d'une page Web en Visual Basic 2008 Express Edition
    Par Harry Covair dans le forum Windows Forms
    Réponses: 1
    Dernier message: 30/06/2008, 00h54
  5. Conventions à utiliser pour la création d'une DLL
    Par Writer dans le forum Langage
    Réponses: 3
    Dernier message: 02/08/2005, 09h24

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