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 :

Installation de FFTW sous VisualC++ 2008 Express


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Installation de FFTW sous VisualC++ 2008 Express
    Bonjour,

    J'essaye en vain de faire fonctionner la librairie FFTW sous Visual C++ 2008.
    J'ai essayé plusieurs packages précompilés (trouvés sur www.fftw.org) ainsi que ceux de Millie (http://humbert-florent.developpez.co...aitement/fftw/).

    Malheureusement, j'ai toujours l'erreur suivante:
    error LNK2019: symbole externe non résolu _fftw_malloc@4 référencé dans la fonction "private: void __thiscall CRechCentre::TakeReferenceRotation(unsigned char *)" (?TakeReferenceRotation@CRechCentre@@AAEXPAE@Z)
    1>Debug\RechCentre.dll : fatal error LNK1120: 1 externes non résolus

    J'ai l'impression que le compilateur ne trouve pas le fichier fftw3.dll, pourtant j'ai spécifié le chemin dans les Popriétés du projet->Editeur de liens->Général->Répertoires de bibliothèques supplémentaires

    Quelqu'un pourrait-il m'aider ?

    Merci d'avance,

    Xavier

  2. #2
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par XavierBreuer Voir le message
    Malheureusement, j'ai toujours l'erreur suivante:
    error LNK2019: symbole externe non résolu _fftw_malloc@4 référencé dans la fonction "private: void __thiscall CRechCentre::TakeReferenceRotation(unsigned char *)" (?TakeReferenceRotation@CRechCentre@@AAEXPAE@Z)
    1>Debug\RechCentre.dll : fatal error LNK1120: 1 externes non résolus

    J'ai l'impression que le compilateur ne trouve pas le fichier fftw3.dll, pourtant j'ai spécifié le chemin dans les Popriétés du projet->Editeur de liens->Général->Répertoires de bibliothèques supplémentaires
    Ca ne suffit pas pour linker une librairie. Trois choses à faire:
    • Ajouter le .h de la librairie au projet (si nécessaire, ajouter le chemin dans les propriétés du projet)
    • Spécifier dans Popriétés du projet->Editeur de liens->Général->Répertoires de bibliothèques supplémentaires le chemin de la libirairie (.LIB)
    • Ajouter dans Popriétés du projet->Editeur de liens->Entrée->Dépendances supplémentaires le .LIB de la librairie (et non la .DLL)
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Bonjour SpoutSpout,

    Merci pour ta réponse.

    La première condition était vérifiée (concernant le .h).
    En ce qui concerne les points 2 et 3, en fait, dans les "Dépendances supplémentaires", j'avais bien ajouté le .lib (avec son chemin de localisation absolu c:\visual\fftw\fftw3.lib, donc il trouvait bien le .lib (confirmé d'ailleurs car si je retire la ligne, l'erreur change et est explicite).

    J'ai refait des tests en suivant tes conseils, mais j'ai toujours la même erreur.

    Une idée de ce qui pourrait la causer ? Que faut-il faire du fichier fftw3.dll ? Faut-il le placer dans un répertoire particulier ?

    De façon plus générale, quelqu'un utilise-t-il FFTW avec VisualC++ ? Si oui, avec quel package FFTW ?

    Merci d'avance pour votre aide,

    Xavier

  4. #4
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Au moment de la compilation, tu n'as besoin que du .h et du .lib. La dll ne sera utilisée qu'à l'exécution.

    L'erreur que tu rencontres indique clairement qu'il ne trouve pas la fonction _fftw_malloc(). Es-tu sûr que cette fonction existe (après une brève lecture de la DLL et du .h, il semblerait que ce soit fftw_malloc()).
    Utilises-tu d'autres fonctions de la librairie?
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    En tous cas, elle semble exister car "l'écriture automatique" de VC++ me propose les paramètres pour cette fonction et de plus, j'ai simplement recopié un exemple... Maintenant, ce n'est pas moi qui ai fait le .lib.

    Voici mes lignes de code source:

    fftw_complex *in, *out;
    fftw_plan p;

    in= (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * NC);

    En tous cas, merci pour tes réponses,

    Xavier

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je viens de créer une application console Win32 pour faire un test de la fftw. Cette fois, cela fonctionne immédiatement, plus de problème le link, pourtant j'ai inclu exactement les mêmes références dans les propriétés de VC++.

    La seule différence avec mon application précédente, c'est que celle-ci est en réalité une DLL (un filtre Directshow).
    Y a-t-il d'autres choses à faire (ou à configurer) pour utiliser une lib (fftw3.lib) dans une DLL ?

    Merci d'avance pour votre aide,

    Xavier

  7. #7
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    J'ai refait l'exemple que tu as donné (sans le "* NC", étant inconnu), et je n'ai pas d'erreur pour la fontion fftw_malloc
    Je persiste à dire que c'est une erreur de lien. Je te redonne la procédure de lien en partant de 0:
    • Fichier->Nouveau Projet->Application console Win32
    • Mettre dans le répertoire du projet les fichiers fftw3.h et fftw3.lib
    • Ajouter au projet l'élément existant fftw3.h
    • Dans les propriétés du projet->Propriétés de configuration->Editeur de liens->Entrée->Dépendances supplémentaires, ajouter "fftw3.lib"
    • Mettre le code donné en exemple dans le _tmain (sans le "* NC")
    • Ajouter #include "fftw3.h" au début du fichier .cpp
    • Générer
    Si tu respectes bien la procédure ci-dessus (je viens de la vérifier), tu auras juste 2 warnings sur les variables p et out qui ne sont pas utilisées, mais le projet compilera. Tu n'auras même pas besoin de la DLL car la librairie sera liée statiquement (via le .lib) à l'exécutable généré.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Salut Spoutspout,

    Merci pour ta réponse.
    Effectivement, avec une nouvelle application console Win32 cela fonctionne (c'est ce que j'indique dans mon mail précédent, mais c'est vrai que je n'ai pas été des plus clairs).

    Mais par contre quand je fais la même chose (les mêmes inclusions) dans mon projet de filtre Directshow (qui est une DLL), cela ne fonctionne pas, j'ai tjs une erreur de link -> d'où ma question, faut-il faire autre chose qd on veut utiliser une lib dans une DLL ?

    Code Voici le prototype de mon filtre Directshow défini dans le .h : 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
    class CRechCentre : public CTransformFilter, 
    					public IIPRechCentre,
    					public IIPRotation
    {
     
    public:
     
        DECLARE_IUNKNOWN;
        static CUnknown * WINAPI CreateInstance(LPUNKNOWN punk, HRESULT *phr);
     
    	CCritSec* pStateLock(void) { return &m_RechCentreLock;}		// provide our critical section
     
        // Reveals IIPRechCentre
        STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv);
     
        // Overrriden from CTransformFilter base class
    	HRESULT Transform(IMediaSample *pIn, IMediaSample *pOut);
     
    	// These implement the custom IIPRechCentre interface
        STDMETHODIMP IPRechCentre_PutAutoSetting(void);
     
    	// These implement the custom IIPRotation interface
    	STDMETHODIMP IPRotation_PutTakeReference(void);					
     
    private:
     
        // Constructor
        CRechCentre(TCHAR *tszName, LPUNKNOWN punk, HRESULT *phr);
     
       void CRechCentre::TakeReferenceRotation(BYTE *pBuffer);
     
    }; // Rech_Centre

    Code et voici la fonction qui appelle fftw définie dans le .cpp : 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
    void CRechCentre::TakeReferenceRotation(BYTE *pBuffer)
     {
     
    	/* Init des buffers pour FFT */
    	fftw_complex *in, *out;
    	fftw_plan p;
     
    	in= (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * NC);
    //	out= (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * NC);
    //	p= fftw_plan_dft_1d(NC,in,out,FFTW_FORWARD,FFTW_ESTIMATE);
     
     
    //	fftw_execute(p);
     
     
    }
    Serait-ce dû à des fonctions virtuelles,... ???

  9. #9
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Non, il n'y a rien de plus à faire.

    1) Soit tu mets le .lib dans le répertoire du projet et tu as juste à l'ajouter dans la ligne propriétés du projet->Propriétés de configuration->Editeur de liens->Entrée->Dépendances supplémentaires des options du projet,
    2) Soit tu mets le .lib dans un répertoire externe et il faut que tu rajoutes (en plus du 1) ) le chemin de la librairie dans la ligne Propriétés de configuration->Editeur de liens->Général->Répertoires de bibliothèques supplémentaires des options du projet.

    C'est comme ça qu'on lie une librairie statiquement avec Visual, il n'y a pas d'autre moyen. Si tu ne fais pas l'un des deux point correctement, ça ne marchera pas.

    Pour vérifier que tes options sont bonnes, tu peux vérifier dans Propriétés de configuration->Editeur de liens->Ligne de commande que tu as:
    - pour le cas 1) fftw3.lib au milieu des autres librairies incluses
    - pour le cas 2) fftw3.lib au milieu des autres librairies incluses + /LIBPATH:"mon répertoire où il y a le .lib"

    Si la ligne de commande est correcte mais que tu as toujours ton erreur de lien, c'est que le .lib n'est pas dans le répertoire spécifié. Je ne vois pas d'autre solution
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Salut Spoutspout,

    J'ai enfin trouvé !
    En fait, il faut changer la Convention d'appel (Propriétés->C/C++-> Avancé) de __stdcall (/Gz) en __cdecl (/Gd) dans les options du projet.

    Ainsi, ça fonctionne, je suppose que c'est parce que la librairie FFTW est écrite en C. Tout bête, mais fallait y penser ;-))

    En tous cas, grand merci à toi de m'avoir épaulé.

    Xavier

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Si c'est un problème de convention d'appel, alors peut-être que ça marcherait aussi avec des includes dans le genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    extern "C"
    {
      #include "machin.h"
    }
    Si ça marche, c'est peut-être plus intéressant que d'avoir à modifier les paramètres du projet.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Salut Charlemagne,

    C'est effectivement une bonne suggestion, malheureusement cette syntaxe-là fonctionne pas. Et je n'en ai pas trouvé d'autre dans le help #include et preprocessor.

    Peut-être que quelqu'un a une autre idée ?

    Je suis disposé à tester...

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Dommage. J'avais fait cette proposition car c'était la méthode pour intégrer la librairie ATLAS (algèbre linéaire) dans des programme C++.

    Sinon j'avais fait moi même un projet pour Visual 2003 de FFTW 3.1.1.
    (la version 3.1.1 est d'après mes benchmarks globalement meilleure que l'actuelle version 3.2alpha, allez savoir pourquoi... et depuis le temps qu'ils en sont à la 3.2alpha, je me dis qu'il y a qqs problèmes...)
    Je n'ai jamais eu de problème de convention d'appel en C.

    En fait 2 projets en 1, un pour les floats, un pour les doubles. Paramétrés pour utiliser SSE/SSE2. Pour ce faire j'ai 2 fichiers de config, disposés dans 2 répertoires voisins.

    Si ça t'intéresse, donne moi ton mail par message privé, et je te transmettrai ce projet.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/12/2009, 23h11
  2. installer directx sdk sous visual c++ express 2008
    Par argon dans le forum DirectX
    Réponses: 1
    Dernier message: 16/10/2009, 08h07
  3. utiliser ReportViewer sous vb 2008 Express
    Par bhc25 dans le forum VB.NET
    Réponses: 1
    Dernier message: 24/03/2009, 13h14
  4. Problème pour lancer un fichier sous VB 2008 Express Edition
    Par bluetotoro dans le forum Windows Forms
    Réponses: 2
    Dernier message: 24/09/2008, 21h54
  5. probleme de l'installation de openssl sous mandriva 2008
    Par youssef_baba dans le forum Mandriva / Mageia
    Réponses: 2
    Dernier message: 29/04/2008, 10h15

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