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++Builder Discussion :

Linker error du compilateur


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut Linker error du compilateur
    Bonjour !!

    J'ai un souci avec mon petit prog ou plutôt lors de la compilation.

    En fait, j'ai donc mon projet avec une frame standard. J'ai construit une classe annexe. Cette classe, je l'ai déclarée dans un header à part, et j'ai codé les fonctions associées (Désolé, j'arrive plus à me souvenir des termes techniques pour être plus précis....) dans un fichier cpp. Jusque là, rien d'extraordinaire, je l'ai déjà fait pour d'autres programmes, d'autres classes... Sauf que là, ça marche pas. Mon compilateur arrive à linker vers la déclaration des fonctions, mais pas vers leur code on dirait. Pourtant le fichier cpp où elles sont codées fait partie de mon projet, mais non. La manière non élégante que j'ai trouvé pour pallier à ça, c'est de coder les fonctions en "inline" dans le header. Sauf que vous serez d'accord avec moi, c'est vraiment pas élégant.

    Est-ce qu'il y a qqch que je fais pas correctement ?? Merci pour votre aide !

    Juste pour préciser, les fonctions sont déclarées en public évidemment....

  2. #2
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Salut,
    tels que tu me décrit le problème, je pense que tu as oublié dans ton fichier .cpp de spécifier le nom de la classe devant la fonction, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void MaClasse::MaFonction(voir)
    Mais je ne peut en être sur sans du code et le message d'erreur précis du linker, n'hésite pas à poster du code, même avec les nom variables et de fonction modifier si ce code est sensible

  3. #3
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    Salut !

    Non non, y'a rien de "sensible" dans mon code t'inquiète ! C'est tout simplement une des nombreuses classes perso de matrices. J'ai besoin de ça pour me simplifier la vie pour le calcul des matrices de Cholesky dans une méthode de Monte Carlo.

    Voici les codes :

    Header
    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
    #ifndef _MATRIX_
    #define _MATRIX_
     
    #include <vector>
    #include <cassert>
    #include <iostream>
     
    template <class T> class matrix{
        protected:
            std::vector<std::vector<T> > data;
            std::size_t NBLignes;
            std::size_t NBColonnes;
        public:
            //Constructeur par defaut
            matrix(){}
     
            //Alloue en memoire une matrice
            //param nb_lig Nombre de ligne
            //param nb_col Nombre de colonne
            matrix(std::size_t nb_lig,std::size_t nb_col){
                NBLignes = nb_lig;
                NBColonnes = nb_col;
                for(std::size_t lig=0;lig<nb_lig;++lig){
                    std::vector<T> tmp(nb_col,T());
                    data.push_back(tmp);
                }
            }
     
            //brief Destructeur
            ~matrix(){}
     
            //return Le nombre de ligne
            inline std::size_t nbLignes() const{
                return data.size();
            }
     
            //return Le nombre de colonne
            inline std::size_t nbCols() const{
                if (data.size()==0) return 0;
                return data[0].size();
            }
     
            //Accesseur vers un element de la matrice
            //param lig son numero de ligne
            //param col son numero de colonne
            //return la valeur stockee
            inline T get(std::size_t lig,std::size_t col) const{
                assert(lig<NBLignes);
                assert(col<NBColonnes);
                return data[lig][col];
            }
     
            //brief Accesseur vers un element de la matrice
            //param lig son numero de ligne
            //param col son numero de colonne
            //param val la valeur a stocker
            inline void set(std::size_t lig,std::size_t col,T val){
                assert(lig<NBLignes);
                assert(col<NBColonnes);
                data[lig][col]=val;
            }
     
           inline matrix<T> cholesky(){
               int i,j,k;
               double sum;
               matrix<T> CholMat(NBLignes,NBLignes);
               for (i=0;i<NBLignes;i++) {
                 for (j=i;j<NBLignes;j++) {
                   for (sum=data[i][j],k=i-1;k>=0;k--) sum -= CholMat.get(i,k)*CholMat.get(j,k);
                    if (i == j)
                      CholMat.set(i,i,sqrt(sum));
                    else CholMat.set(j,i,sum/CholMat.get(i,i));
                 }
               }
               return CholMat;
             };
    };
    #endif
    le .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
    #include "ClasseMatrice.h"
     
    //Factorisation de Cholesky
    template <class T>
    matrix<T> matrix<T>::cholesky(){
       int i,j,k;
       double sum;
     
       matrix<T> CholMat(NBLignes,NBLignes);
     
       for (i=0;i<NBLignes;i++) {
         for (j=i;j<NBLignes;j++) {
           for (sum=data[i][j],k=i-1;k>=0;k--) sum -= data[i][k]*data[j][k];
           if (i == j)
             CholMat.set(i,i,sqrt(sum));
           else CholMat.set(j,i,sum/CholMat.get(i,i));
         }
       }
     
       return CholMat;
    }
    et dans le .cpp principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include "ClasseMatrice.h"
    //....
    matrix<double> CholAv(3,3);
    CholAp=CholAv.cholesky();
    ce qui me donne à la compilation :

    [Linker Error] Unresolved external 'matrix<double>::cholesky()' referenced from C:\USERS\blablablabla\OPTIONPRICING.OBJ

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    Mets le code de ta fonction choleski dans ton .h...

  5. #5
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Dans le cpp, tu ne doit pas mettre le <T> dans le nom de la classe (en rouge dans le code) :
    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
    #include "ClasseMatrice.h"
    
    //Factorisation de Cholesky
    template <class T>
    matrix<T> matrix::cholesky(){
       int i,j,k;
       double sum;
    
       matrix<T> CholMat(NBLignes,NBLignes);
    
       for (i=0;i<NBLignes;i++) {
         for (j=i;j<NBLignes;j++) {
           for (sum=data[i][j],k=i-1;k>=0;k--) sum -= data[i][k]*data[j][k];
           if (i == j)
             CholMat.set(i,i,sqrt(sum));
           else CholMat.set(j,i,sum/CholMat.get(i,i));
         }
       }
    
       return CholMat;
    }

  6. #6
    Membre confirmé
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Par défaut
    J'ai déjà essayé de ne pas lui mettre le <T> dans le nom de la classe, mais il me retourne une autre erreur comme quoi faut que je précise de quelle classe je parle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [C++ Error] ClasseMatrice.cpp(55): E2102 Cannot use template 'matrix<T>' without specifying specialization parameters
    Et pour répondre à totoche76, c'est justement ça que je veux éviter, de mettre le code de la fonction dans le .h

  7. #7
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Ah, mais oui, le problème c'est que tu fait une classe Template, je viens de me souvenir que les méthode template doivent impérativement être développé inline, ceci explique cela

    Donc il n'y as pas trop de solution (cf la FAQ Cpp)

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

Discussions similaires

  1. [Qt4] Linker error (vtable)
    Par titus55 dans le forum Qt
    Réponses: 7
    Dernier message: 23/05/2007, 10h04
  2. [Linker error] undefined reference to 'IcmpSendEcho@'
    Par Xevious dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 29/12/2005, 16h45
  3. Réponses: 17
    Dernier message: 25/10/2005, 10h09
  4. Linker error :^/
    Par Ekinoks dans le forum OpenGL
    Réponses: 15
    Dernier message: 05/09/2004, 14h18
  5. [Kylix] probleme (LINKER ERROR)
    Par subzero82 dans le forum EDI
    Réponses: 2
    Dernier message: 14/05/2004, 19h28

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