Fehler beim Linken LNK2019



  • Hi

    Habe folgendes Problem.

    Ich habe ein grösseres C-Projekt.
    Nun willin einer der SOURCE-dateien einige Funktionen benutzen, die ich in einem seperaten c++-File (dld.cpp) definiert habe. Des weiteren hab ich ein header-file (dld.h) geschrieben, in welchem die Funktionen deklariert sind. Diese h-File binde ich nun mittels #include in einem weiteren source-File ein, in dem ich die Funktionen aus dld.cpp gerne benutzen würde. Ist mein Vorgehen prinzipiell richtig?
    ungefähr so:

    dld.h:

    #ifndef DLD_H
    #define DLD_H
    
    int geth(double x, double t,  double *h);
    int get_Qv_ind(double x, double r, double t,  double T, double *Qv_ind);
    int get_dld_Mat();
    
    #endif
    

    dld.cpp:

    #include "../so/dld.h"
    #include "../hd/ge_types.h"
    #include <iostream>
    #include <vector>
    #include <string>
    #include <fstream>
    #include <cstdio>
    #include <cmath>
    
    using namespace std;
    
    const double pi = 3.14159265;	// Pi
    
    //Private Variables
    
    vector< vector<double> > dld_Mat;	// Matrix with Temperature and corresponding material properties
    
    fstream infile;
    string s;
    
    double dld_Mu0 = 4*pi*1.e-7;	// magnetic constant [H/m]
    
    //noch mehr variablen werden initialisiert und definiert
    
    int geth(double x, double t, double *h)
    {
        //blabla	
    }
    
    int get_dld_Mat()
    {
        //blabla
    }
    
    int get_Qv_ind(double x, double r, double t, double T, double *Qv_ind)
    {
       //blabla	
    }
    

    und schliesslich so_temp.c (C-File)

    //mehrere include's
    #include "dld.h"
    
    int irgendeine funktion()
    {
       //blabla
       geth(..);
       get_dld_Mat();
       get_Qv_ind(...);
    }
    

    Kompilieren funktioniert. Nur beim Linken krieg ich dann die folgenden Fehlermeldungen:

    so_temp.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_get_Qv_ind" in Funktion "_tl_so_ThermoSolve".
    so_temp.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_get_dld_Mat" in Funktion "_tl_so_ThermoSolve".
    so_temp.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_geth" in Funktion "_tl_so_HeatSurfaceFluid".

    Ich arbeite mit MS VS2005



  • In C und C++ werden die Funktionen in unterschiedliche Symbolnamen für die Modul-Dateien (.obj) umgesetzt. Wenn eine C-Bibliothek, die du verwendest, erwartet, dass du einige Funktionen bereitstellst, dann musst du diese daher in einem extern "C" { ..... } kapseln, damit diese Bibliothek deine Funktionen "findet".
    Ich hoffe ich habe das Problem jetzt richtig interpretiert. Die fehlenden Unterstriche irritieren mich jetzt aber auch irgendwie, immerhin stellt es keinen guten Stil dar, eigene Symbolnamen mit _ beginnen zu lassen, da diese üblicherweise für Plattformspezifische Details verwendet werden. Evtl. stammt das aber auch vom Mangling, ich bin da gerade nicht so sicher 🙂

    Viele Grüße,
    Michael



  • hi
    erst mal vielen dankfürdie schnelle Antwort. Die Unterstriche zu Beginn der Funktionsnamen in den Fehlermeldungen sind nicht von mir. Das wurde in der Fehlermeldung einfach so ausgegeben. Und wie muss ich dass jetz machen? exter "C" {} um die ganze header-Datei?



  • pitaz schrieb:

    Und wie muss ich dass jetz machen? exter "C" {} um die ganze header-Datei?

    Nein, denn C kann mit extern "C" nichts anfangen ;).

    Mach das um die Funktionsdefinitionen in der .cpp-Datei (oder schreib es einfach vor jede Funktionsdefinition).



  • Hallo

    Ok, habe jetzt um die Funktionsdefinitionen ein extern "C" gemacht.
    Also so:

    #include "../so/dld.h"
    #include "../hd/ge_types.h"
    #include <iostream>
    #include <vector>
    #include <string>
    #include <fstream>
    #include <cstdio>
    #include <cmath>
    
    using namespace std;
    
    const double pi = 3.14159265;    // Pi
    
    //Private Variables
    
    vector< vector<double> > dld_Mat;    // Matrix with Temperature and corresponding material properties
    
    fstream infile;
    string s;
    
    double dld_Mu0 = 4*pi*1.e-7;    // magnetic constant [H/m]
    
    //noch mehr variablen werden initialisiert und definiert
    
    extern "C"{
    int geth(double x, double t, double *h)
    {
        //blabla   
    }
    
    int get_dld_Mat()
    {
        //blabla
    }
    
    int get_Qv_ind(double x, double r, double t, double T, double *Qv_ind)
    {
       //blabla   
    } 
    }
    

    Jetzt bekomme ich diese Fehlermeldung:

    c:\dld\pf_2d_mod\so\dld.cpp(114) : error C2732: Bindungsangaben widersprechen vorheriger Angabe für 'geth'
    c:\dld\pf_2d_mod\so\dld.cpp(113): Siehe Deklaration von 'geth'
    c:\dld\pf_2d_mod\so\dld.cpp(153) : error C2732: Bindungsangaben widersprechen vorheriger Angabe für 'get_dld_Mat'
    c:\dld\pf_2d_mod\so\dld.cpp(152): Siehe Deklaration von 'get_dld_Mat'
    c:\dld\pf_2d_mod\so\dld.cpp(239) : error C2732: Bindungsangaben widersprechen vorheriger Angabe für 'get_Qv_ind'
    c:\dld\pf_2d_mod\so\dld.cpp(238): Siehe Deklaration von 'get_Qv_ind'



  • In die Headerdatei muss das extern "C" auch. Wenn du diese header-Datei auch von C-Dateien aus verwenden möchtest (Was ich jetzt aber nicht annehme), kannst du dir mit folgendem Trick behelfen:

    #ifdef  __cplusplus
    extern "C" {
    #endif
    
    .... Funktionsdeklarationen hier
    
    #ifdef __cpluspus
    }
    #endif
    


  • Btw, warum machst du denselben Thread in 2 Foren auf? Oo



  • Wie mienst du:

    [quote "Decimad"]
    In die Headerdatei muss das extern "C" auch. Wenn du diese header-Datei auch von C-Dateien aus verwenden möchtest
    [/quote]

    Ich muss doch die Header-Datei von C-Dateien aus benutze um C++-Funktionen einer anderen Datei in de C-Datei verwenden zu können. Wie macht man denn standardmässig eine Schnittstelle zwischen C und C++?

    Wenn ich in der Header Datei das

    #ifdef  __cplusplus
    extern "C" {
    #endif
    
    .... Funktionsdeklarationen hier
    
    #ifdef __cpluspus
    }
    #endif
    

    benutze, bekomme ich über 100 Fehlermeldungen von denen die miesten so:

    error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden

    aussehen



  • Da sollen auch wirklich nur die 3 Funktionsdeklarationen rein, sonst nix!



  • Hallo, du meinst in der C-Datei. Nein, die C-Datei ist sehr umfangreich (ca. 2300 Zeilen). Ich brauche einfach an einigen Stellen diese 3 Funktionen, die in einem seperaten File in C++ geschrieben sind.



  • Ich wollte damit sagen, du sollst das nicht "um die ganze Headerdatei" drummachen, sondern nur um die Deklaration dieser 3 Funktionen in der Headerdatei. C kennt keine Klassen oder Templates, darum gibts auch keine C-kompatiblen Symbolnamen dafür....



  • Ja, Es sind nur 3 C++-Funktionen die ich in einem C-Code verwenden will


Anmelden zum Antworten