LNK2019 - Obwohl die Lib eingebunden ist, Header vorhanden... :(



  • Hallo zusammen,

    ich verzweifle mal wieder. In meinem Programm binde ich eine LIB von einem OpenSource (Soar) ein.

    #include "sml_ClientKernel.h"
    #pragma comment (lib, "ClientSML.lib")
    

    Die LIB wurde zuvor einwandfrei kompiliert (also der OpenSource-Code). Wenn ich nun in meinem Projekt die LIB also einbinde (siehe oben) und die Methode CreateKernelInNewThread aufrufe.

    pKernel = Kernel::CreateKernelInNewThread();
    

    kommt es zu dem Linker-Fehler.

    Strategies.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: static class sml::Kernel * __stdcall
    sml::Kernel::CreateKernelInNewThread(char const *,int)" (?CreateKernelInNewThread@Kernel@sml@@SGPAV12@PBDH@Z)" in Funktion 
    ""private: static void __stdcall Strategies::prepareWithSoar(void)" (?prepareWithSoar@Strategies@@CGXXZ)".
    

    Vielleicht noch ein paar Hinweise, um die Fehlersuche zu erleichtern 😞

    In der Headerdatei wird die Methode wie folgt deklariert:

    static Kernel* CreateKernelInNewThread(char const* pLibraryName = kDefaultLibraryName, int portToListenOn = kDefaultSMLPort) ;
    

    und in der Implementierungsdatei wie folgt definiert:

    Kernel* Kernel::CreateKernelInNewThread(char const* pLibraryName, int portToListenOn)
    {
      return CreateEmbeddedConnection(pLibraryName, false, false, portToListenOn) ;
    }
    

    Meine Zuweisung (pKernel) erfolgt an ein Attribut meiner Klasse und ist wie folgt deklariert

    static Kernel* pKernel;
    

    Bitte helft mir... ich verzweifle... danke



  • ich würde dir empfehlen die libs nicht mit dem pragma einzubinden.
    Das ist 1. Compilerabhängig und 2. sind sind so die abhängigkeiten nicht übersichtlich, da in jedem file sowas stehen kann.
    Vcc: benutze hierfür die linkereinstellungen der projekteigenschaften
    andere: benutze hierfür die entsprechenden linkerparameter im makefile



  • Hi,
    ich benutze VS 2005.

    Normalerweise benutze ich auch den Weg über die Linkereinstellungen, das pragma comment war der Versuch einer Fehlerbehebung. Machte aber leider keinen Unterschied... 😞



  • bindest du hier eine importbibliothek für eine dll ein ( dann sollte parallel zu der lib eine dll liegen), oder direkt eine statische lib.

    für den Fall einer Importbibliothek:
    vielleicht wird diese Funktion gar nicht exportiert wird, sprich außerhalb der lib nicht sichtbar ist.

    Wenn die lib von dir ist, dann schau dir mal die declspec geschichte an!
    Du musst es so deixeln, dass wenn du die lib übersetzt im header vor der klasse (falls kernel eine Klasse ist) oder vor der Funktion (falls Kernel ein Namespace ist) ein Declspec(dllexport) steht.

    Wenn du die headerdatei von außen includierst muss da ein Declspec(dllimport) hin.

    Das wird normalerweise mit macros gemacht.

    im pch:

    #define MyDECLSPEC Declspec(dllexport)
    

    defs.h:

    #ifndef MyDECLSPEC 
    #define MyDECLSPEC Declspec(dllimport)
    #endif
    

    Kernel.h

    #include "defs.h"
    
    class MyDECLSPEC Kernel
    {
    ...
    }
    

    Kernel.cpp

    #include "pch.h"
    #include "Kernel.h
    
    Kernel* Kernel::...
    


  • lol was f+ürn schwachsinn, wenn er es in den projekteinstellungen einstellt ist es nicht compiler/ide abhängig oder was? leute gebt nicht immer solche witzlosen ratschläge, natürlich kann er pragma daf+ür verwenden



  • Auf deine unqualifizierten, pissigen Kommentare kann man verzichten.

    die definition im makefile oder den projektsettings ist sinnvoll, da da alle Abhängigkeiten an einer stelle ersichtlich sind.
    die definition per pragmas ist nicht sinnvoll, da pragmas-commandos 1. compilerabhängig (sind möglicherweise nicht in jedem compiler implementiert) sind und 2. die Abhängikeiten über alle sourcefiles verteilt sind, was der Übersichtlichkeit nicht unbedingt gut tut.

    Außerdem habe ich nicht gesagt, dass er sie nicht verwenden kann, ich habe den Tip gegeben, die Abhngigkeiten übersichtlicher zu handhaben.


Anmelden zum Antworten