Linker Problem



  • Hallo!

    Es handelt sich um folgendes Problem:
    Fehlermeldung:

    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol " int bingo(int,unsigned short)" (?bingo@@YAHHG@Z)
    

    Ich arbeite mit MS Visual C++ Version 6.0 und habe die entsprechende *.lib in das Projekt über Projekt->dem Projekt hinzufügen->Dateien: hinzugefügt

    In einer Headerdatei habe ich folgendes deklariert:

    extern int _cdecl _bingo(int bla,unsigned short blub);
    

    Aufruf in *.cpp Datei:

    errorvar = _bingo(intvar,intvar2);
    

    Die Frage ist:
    Warum findet er die "Symbole", die aus der *.lib geladen werden sollten, nicht???

    gruß
    djabber



  • Und wo ist die dazugehörige Funktionsdefinition (Rumpf)?

    PS: Es gibt übrigens einen Unterschied zwischen "bingo(...)" und "_bingo(...)"



  • Öhm ja...

    Also die Funktiondefinition ist in der *.lib soweit ich das verstanden habe...

    und was meinst du bitte mit:

    PS: Es gibt übrigens einen Unterschied zwischen "bingo(...)" und "_bingo(...)"



  • djabber schrieb:

    Öhm ja...

    Also die Funktiondefinition ist in der *.lib soweit ich das verstanden habe...

    Na offensichtlich nicht - sonst hätte er sie ja dort gefunden.

    und was meinst du bitte mit:

    PS: Es gibt übrigens einen Unterschied zwischen "bingo(...)" und "_bingo(...)"

    Laut Fehlermeldung vermisst er eine Funktion "bingo()", im übrigen Problemcode nennst du die Funktion dann "_bingo()" - das sind zwei völlig verschiedene Funktionen.

    *nachdenkt* Vielleicht hast du auch nur eine andere Aufrufkonvention verwendet als im Original - der erweiterte Name ("?bingo@@YAHHG@Z") hängt auch davon ab, welche Aufrufkonvention (und welchen Compiler) du verwendet hast. Was steht denn im Header der verwendeten Library.



  • Laut Fehlermeldung vermisst er eine Funktion "bingo()", im übrigen Problemcode nennst du die Funktion dann "_bingo()" - das sind zwei völlig verschiedene Funktionen.

    Wie schon geschrieben habe muß man die Funktionen, laut der Funktionsbeschreibung vom Hersteller (da kommt auch die *.lib her), mit "_" schreiben.

    Warum der Linker allerdings eine Funktion ohne "_" anmäkelt verstehe ich nicht...

    *nachdenkt* Vielleicht hast du auch nur eine andere Aufrufkonvention verwendet als im Original - der erweiterte Name ("?bingo@@YAHHG@Z") hängt auch davon ab, welche Aufrufkonvention (und welchen Compiler) du verwendet hast. Was steht denn im Header der verwendeten Library.

    Das Problem ist, dass ich auf die Datei aus der die *.lib erstellt wurde keinen Zugriff habe und somit leider den Header nicht einsehen kann...

    Anmerkung:
    Wenn ich nur eine einfaches Projekt erstelle mit:
    main.cpp
    *.h
    *.lib
    und dann auf die Funktionen zugreife via "_funktion()" gehts...



  • Habe grade das hier gefunden, wobei ich da aber nicht steht, wie man dass beheben kann..
    http://support.microsoft.com/kb/248883/de

    Der LNK2001-Fehler, der in dem Symptomabschnitt beschrieben wird, tritt auf, da die Compiler für das konstante Arrayvariable für Visual C++ 6.0 und Visual C++ 5.0 andere ergänzte Namen generieren. Wenn Sie versuchen, folgend zu verknüpfen, tritt der Fehler auf
    • Ein konstanter Matrixverweis auf einer konstanten Matrixdefinition in einem Visual C++ 5.0 DLL oder einer statischen Visual C++ 5.0-Bibliothek in einem VISUAL C++ 6.0-EXE
    • Ein konstanter Matrixverweis in einem VISUAL C++ 5.0-EXE zu der konstanten Matrixdefinition in einem Visual C++ 6.0 DLL oder einer statischen Visual C++ 6.0-Bibliothek
    • Ein konstanter Matrixverweis in einem EXE von Visual C++ zu einer konstanten Matrixdefinition in einem Visual C++ 5.0 DLL oder einer statischen Visual C++ 5.0-Bibliothek. (Ergänzte Namen, die von dem Compiler für konstante Arrayvariable von Visual C++ generiert werden, sind identische dem Visual C++ 6.0-Compiler dawie).



  • Dann lass dir mal vom Hersteller einen vernünftigen Header liefern. Vielleicht reicht es auch schon aus, das "_cdecl" bei der Deklaration wegzulassen.



  • Danke für die schnellen Antworten!!



  • Die Lösung des Problems lag nicht am compiler sondern am Präprozessor.

    Der hatte die Vorgabe alles STRICT zu behandeln...^^

    Ergo hat er den Code, der in der *lib stand nicht akzeptiert, da dieser in C geschrieben war...und das Programm in C++

    Das Strict in der Präprozessoranweisung war durch WxWidges gefordert. (durch den Vorprogrammierer der Anwendung eingefügt)

    Ich hoffe vielleicht kann dies irgendjem. vielleicht auch mal helfen 😉

    Gruß
    djabber


Anmelden zum Antworten