DLL verliert include vom SDK beim einbinden.



  • Hallo community.

    Habe derzeit wieder ein sehr komisches Problem.

    Ich habe derzeit eine DLL welche ich in eine andere DLL einbinde:
    Folgendes soll dies kurz verdeutlichen.

    Bildverarbeitung.DLL-----> Cameracontroller.DLL------------>SDK von Kamera

    In der Cameracontroller DLL ist eine Klasse in welcher ich in der .h Datei meine .h-Dateien vom SDK includiere.

    Die benötigten Funktionen exportiere ich mit _declspec(dllexport).

    Nun compiliere ich die DLL was auch wunderbar funktioniert.

    Nun zur BildverarbeitungsDLL:

    Hier lege ich einen Verweis an zur CameraDLL.

    und unter einstellungen füge ich c++/zusätzliche includeverzeichnisse den Ordner hinzu in welchem die .h Datei von der Klasse der CameraDLL liegt welche ich nutzen möchte.

    Ich includiere hier nur die .h der Klasse welche ich nutze.

    Wenn ich nun die BilderverarbeitungsDLL compilieren möchte sagt er mir das er die includeverzeichnisse vom SDK welche in der CameraDLL includiert sind genau dort nicht mehr findet.

    Sorry viel Text hoffe es kann sich jemand etwas darunter vorstellen.

    Schonmal vielen Dank für die hilfe.


  • Mod

    Ganz verstehe ich es nicht.

    Aber eigentlich sauber wäre das ganze nur, wenn Deine Kamera Controller DLL nur das SDK verwendet.

    In den Headern, die Du an andere Projekte weitergibst sollte die SDK Includes eigentlich nicht verwendet werden müssen.

    Bist DU sicher, dass Du in beiden Projekten das Kamera SDK Verzeichnis als Include Verzeichnis angegeben hast.



  • Hi, sorry für die späte Antwort.

    Also genau das war auch das ziel. Nur im Cameracontroller soll SDK includiert werden.

    Nur wenn ich dann die DLL irgendwo einbinde und dortiges Projekt compilieren will. Sagt er mir die .h Datei habe er nicht gefunden.

    Und hier sitzt auch mein Problem.

    Ich habe ja in der CameraDLL eine Klasse sitzen. In der dortigen .h datei habe ich die vom SDK benötigten .h Dateien includiert.

    Grund warum diese in der .h Datei sind.

    Ich möchte membervariablen von SDK Objekten erstellen. Dies kann ich aber nur wenn ich diese in der .h includiere weil er sie ja dort schon kennen muss.

    Soweit mein derzeitiger Wissensstand von c++

    Nun weiter:

    Ich erläutere Kurz wie ich die DLL includiere. Vllt. mache ich ja hier auch was falsch.

    ich habe das DLL-Projekt im selben Projektordner wie das Hauptprogramm.

    Im Hauptprogramm wähle ich nun unter "Verweise" meine DLL aus.

    Und nun gehe ich unter eigenschaften auf zusätzliche includeverzeichnisse und dort wähle ich den ort aus wo die .h datei meiner Klasse aus der cameraDLL liegt.

    Nun kann ich diese im Hauptprogramm includieren.
    Und genau ab dann tritt der Fehler auf das er die zusätzlichen Includeverzeichnisse welche in der CameraDLL includiert sind nicht mehr findet.

    Gibt es hierzu eine andere Möglichkeit?

    Oder muss ich schauen das ich auf die Membervariablen verzichte?

    Gruß und schonmal vielen dank


  • Mod

    Verwende die SDK include Header eben nicht.
    Du verwendest Sie, also müssen sie auch gefunden warden. Warum sollte Projekt A auf Projket B Einstellungen zurückgreifen?

    Der Linker benötigt nur die Lib. Der Compoiler benötigt nur die Typen, die Du in die Header Datei der DLL einbaust. Dort gehören weder Klassen, Objekte noch Typen aus der SDK Klasse der Kamera.

    Verwende nur ein neutrals Interface Model nach außen, dass die internen Klassen und Variablen der Kamera eben nicht verwendet.

    PIMPL ist auch eine einsprechende Methode.



  • Ok schonmal danke für deine Hilfe.

    Nur komme ich leider nicht ganz mit.

    Zuerst:

    Meine Frage wie kann ich das lösen ohne die Header von SDK ?
    Diese benötige ich ja um Objekte zu erstellen aus diesem SDK heraus.

    Benötige z.b. ein KameraObjekt mit welchem ich arbeite um die Kamera z.b. Grabben zu lassen.

    Klar dem Linker habe ich die Bibliotheksverzeichnisse gegeben und die zusätzliche includeverzeichnisse unter c/c++ hinzugefügt. Nur kann ich diese doch erst benutzen wenn ich auch die zugehörige Headerdatei eingefügt habe.?

    Nun noch eine weitere Frage:

    Wenn meine Header Datei keine Objekte etc. vom SDK enthalten darf.
    Wie kann ich dann z.b. das KameraObjekt als Member hinzufügen?
    Habe mir überlegt in der Funktion wo ich es benötige es als static zu deklarieren. Könnte ja auch funktionieren.

    Das mit dem neutralen Interface modul habe ich jetzt so verstanden:

    Ich erstelle Funktionen in denen ich Rückgabewerte(welche nichts mit dem sdk zu tun haben) einfach durchreiche. Ist dies richtig verstanden? Somit habe ich keine includes in meiner Klasse nach außen hin. Sondern gebe einfach einen vector oder eine CBitmap durch.

    PIMPL habe ich mir mal kurz angesehen. Aber um das genau zu verstehen braucht es ncoh ein wenig.

    PS: Gerade eben die Header aus der Header entfernt und das Kameraobjekt static gemacht. Die Header vom SDK sind nun in der CPP untergebracht. Funktioniert soweit gut. Nur halt noch keine DLL daraus gemacht, dies ist nun der nächste Schritt.



  • Hi,

    wenn es Probleme gibt mit include -Kollisionen, solltest du das SDK Header
    in dem *.cpp Teil einbinden und nicht in dessen Klassen Header.h
    (möglichst isoliert halten)

    Sollte die Meldung kommen *.h nicht gefunden ist es auch nicht im Suchpath
    enthalten.

    Man kann durchaus sagen das alle SDK's im Programme Ordner landen.

    Um andauernde Probleme zu mindern kann man dem Programmeordner mit Subst einen Buchstaben zuweisen wie z: , man sollte dies für alle Includes auch tun die man selber erstellt, mit der Zeit hast Du viele Header, das beste ist all diese Hilfsprojekte zumeist lib's in einem C:\user\name\Dokumente\MyProject\Common Folder unterzubringen und auch diesen mit Subst y: zu verwenden.

    Dann gilt für alle obenliegenden Projekte Include-Path Lib-Path Y: und Z:

    Grüße
    K.



  • Bisher habe ich es hinbekommen mein Programm zum laufen zu bekommen ohne die Header des SDK in meinem Klassenheader unterzubringen.

    Allerdings hat mich mein Projektbetreuer auf die Idee gebracht, das ich die DLL Dynamisch laden soll mit Funktionspointern.

    So muss ich nicht die Header einbinden und könnte so eine Probleme beseitigen.

    Allerdings habe ich noch keine möglichkeit gesehen mit der ich durch das dynamische Laden eine Klasse erstellen kann.

    Oder ist dies doch möglich ?



  • Bevor du mit dynamisch geladenen DLLs anfängst guck dir lieber das PIMPL Idiom an, das hier ja schon erwähnt wurde.
    Viel einfacher und viel wengier Aufwand als dynamisch DLLs zu laden.

    Vor allem hat das dynamische Laden von DLLs auch nix damit zu tun ob man ein Header-File einbinden muss oder nicht.
    Irgendwoher müssen die passenden Definitionen/Deklarationen immer kommen. Wenn sie nicht aus einem Header File der DLL kommen, dann muss man sie im aufrufenden Programm wiederholen (=duplizieren=böse). Was normalerweise auch nicht Sinn der Sache ist.



  • Ok das PIMPL habe ich mir jetzt mal angeschaut.

    Wenn ich das richtig verstanden habe werden die public Funktionen weiterhin in der Header der Hauptklasse angelegt.

    Zusätzlich dazu wird dann in der CPP zusätzlich eine Unterklasse angelegt in der die privaten Funktionen und Attribute angelegt werden. Und mit einem Zeiger auf die Unterklasse können die publicfunktionen der Hauptklasse auf funktionen und Attribute der Unterklasse zugreifen.

    Ist dies richtig verstanden??

    Somit hätte man wichtige Implementierungsdetails nicht in der Header.

    Wenn ich das richtig verstanden habe. Ist PIMPL eine sehr gute alternative um im Header nur public funktionen zu haben was sehr übersichtlich wäre.



  • Es geht dabei weniger um die Übersichtlichkeit, sondern darum dass man die Implementierungsdetails aus technischen Gründen nicht drinnen haben will.
    z.B. weil dadurch Abhängigkeiten auf weitere Header-Files entstehen.



  • Achso ja klar.

    Dadurch habe ich trotzdem meine Membervariablen habe aber die Header vom SDK nicht im Klassenheader.

    Ok super. Werde meine klassen der DLL´s mal umschreiben und werde das ganze noch einmal mit PIMPL probieren vielen Dank für die Hilfe.

    Wenn ich irgendwo hänge melde ich mich wieder.



  • Also die DLL´s funktionieren Wunderbar mit PIMPL.

    Vielen Dank für diese Info.

    Selbst mein Projektleiter wusste davon nichts. Er hatte halt die DLL´s auch immer Dynamisch geladen.

    Was dann nun wohl mein nächster Schritt ist.


Log in to reply