Statische LIB mit überladenen Funtionen unter VC++



  • Hallo,

    ich habe ein kleines Problem unter VC++. Ich habe eine statische Lib erzeugt und kann bei überladenen Funtionen immer jeweils nur die erstdeklarierte aufrufen, wenn ich diese Lib benutze. Die anderen sind unbekannt und führen zu nicht aufgelösten Symbolen.

    Gibt es eine bestimmte Compileroption die man aktivieren muss, damit er diese überladenen Funktionen erkennt?

    Meine Konfiguration beim compilieren der Lib (Release):
    Konfigurationstyp: Statische Bibliothek (.lib)
    Debuginformationsformat: /Zi
    Warnstufe: /W3
    Nach 64Bit-Probs suchen: /Wp64
    Optimierung: /O2
    Komplette Programmoptimierung: /GL
    Laufzeitbib: /MD
    (Alles andere sollte Standard sein.)

    Wenn ich eine dynamische Lib erzeuge, dann erstellt der Compiler nur eine *.dll, wo ist die *.lib dazu? Beim Einbinden der *.dll gibt es nämlich Fehler 😞

    Grüßle,
    Matthias



  • Ich frag einfach mal: Hast du denn die überladenen Varianten auch implementiert? Also existiert ein Funktionsrumpf dazu? Steht dieser auch in einer .cpp Datei oder ist der im Header? Wenn im Header, dann setz das Schlüsselwort "inline" davor.

    Bei DLLS gibts normal 3 Dateien: .lib, .dll und .def
    Alle 3 schwirren normalerweise im Output-Ordner rum. In den Linkeroptionen kannst aber den Ort festlegen wo die erzeugt werden. Änder das doch einfach mal. Desweiteren musst du bei DDLs die Funktionen explizit exportieren per __declspec (dllexport). Allerdings solltest du ein Makro dafür haben, da du sie beim Verwenden importieren musst.
    Das geht wie folgt: Standardmäßig ist bei Libs PROJEKTNAME_EXPORTS definiert:

    #ifdef PROJEKTNAME_EXPORTS
    #define PROJEKTEXPORT __declspec(dllexport)
    #else
    #define PROJEKTEXPORT __declspec(dllimport)
    #endif /* PROJEKTNAME_EXPORTS */
    

    Nur dann wird auch eine Lib erzeugt.
    rya.



  • Hallo,

    danke für die schnelle Antwort. Die Funktion ist im Header deklariert und in der cpp umgesetzt (sorry, wenn jetzt nicht ganz Sprachkonform ausgedrückt). In der Lib sind beim Übersetzen/Erstellen sowohl die *.cpp als auch die *.h eingebunden.
    Ich habe die gleiche Lib vorher mal mit Borland übersetzt und da hat es funktioniert. 😕

    Wegen der dll: Ich hab nen seperaten Outputordner und da legt der halt nur die *.dll rein 😞 Bei mir steht unter den Allgemeinen Optionen -> Ausgabeverzeichnis -> "$(ProjectDir)lib"

    Grüßle,
    Matthias



  • Hast du im Source vllt irgendwelche Defines stehen, die verhindern, dass der Code kompiliert wird? Hab das eben mal getestet mit ner statischen Lib, da ich die eigentlich fast nie verwende und alles hat geklappt.

    void  foo(int a);
    void  foo(float b);
    void  foo(double c);
    

    UNd wegen der DLL:
    Linker->Erweitert->Importbibliothek->(TargetDir)(TargetDir)(TargetName).lib
    So is das Standard^^ Dort einfach mal auf Standard setzen und kucken was passiert.
    rya.



  • Also #defines gibt es da ne ganze Menge aber Du meinst eher die #ifndef usw. oder? Habe da nix gefunden was Codezeilen beim compilieren ausläßt, da die Deklarationen auch gleich untereinander stehen und er dann die oberste ja auch immer kennt. Um es auf Dein Beispiel zu beziehen, er kenn nur foo(int a);

    Wegen der dll: Genau so steht es bei mir auch drin aber mit der Endung .dll

    Grüßle



  • Letzte Möglichkeit:
    Die Lib ist als C-Code kompiliert. In dem Fall hilft

    extern "C"{
    #include "theLib.h"
    }
    

    Falls das auch nicht hilft, mal bitte Compileroutput posten.

    edit: Und am besten auch etwas Code... kommt mir nämlich alles spanisch vor.^^ Normal sollte das anstandslos klappen ;).

    DLL:
    Änder das auf .lib 😉
    rya.



  • Exportierst Du die Funktionen im C- Style oder im C++- Style (mangled names).
    Ich schätze mal, wenn Du die Funktionen via C- Style exportierst, werden keine Überladungen zugelassen (wie auch).

    Edit:
    Habe gerade gelesen, dass Dir die *.lib fehlt. Würde tippen, dass Du gar nix exportierst.

    simon



  • c kennt doch keine überladungen soweit ich weiß, also kann es mit extern "C" auch nciht gehen.



  • Maxi schrieb:

    c kennt doch keine überladungen soweit ich weiß, also kann es mit extern "C" auch nciht gehen.

    Hmm, keine Ahnung, programmiere kein ANSI-C.

    @simon
    Die .lib fehlt Ihm bei ner DLL.. das isn anderes Problem 😃
    rya.



  • @simon
    Die .lib fehlt Ihm bei ner DLL.. das isn anderes Problem 😃
    rya.

    Warum soll das ein andere Problem sein?
    Wenn Du nix exportierst, gibts auch keine *.lib, wohl aber eine *.dll.
    simon



  • Ist mir echt zu hoch hier... 😡

    Also die Lib ist C++, gibt auch Abhängigkeite etc., kann also kein C sein.

    Wenn ich da statt dll die Endung auf lib ändere, dann hab ich die gleiche Datei wie vorher nur mit lib 🙂 Warum erzeugt der bei mir die anderen Dateien nicht?

    Grüßle



  • Also ich glaube du hast deine Projektdateien irgendwie zerschossen....
    Leg mal neue Projekte an und änder nur das nötigste wie include-pfade etc. Oder resette alle Einstellungen ausser die nötigen via "Vom Standard/Übergeordnetes Projekt erben" bei der Auswahl.
    Und dann probiers nochmal^^. Das is alles zu seltsam um wahr zu sein :D.
    rya.



  • Tipp: Verwende den "Dependency Walker" um zu sehen, was die DLL tatsächlich exportiert und wie sie es exportiert.



  • Hm, na dann mal auf ein Neues...

    DLL:
    Es steht beim Linker -> Erweitert - > Importbib: (TargetDir)(TargetDir)(TargetName).lib Somit sollte der das doch raffen oder? Oder muss ich erst ne Lib erzeugen und dann ne dll? Wäre mir zwar neu aber man weiß ja nie...

    Danke Euch erstmal!

    Grüßle



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten