Reudiger Fuchs Geschrieben 22. April 2010 Teilen Geschrieben 22. April 2010 Hallo, ich habe schon seid Tagen ein Problem. Und zwar versuche ich verschiedene kleinere libs statisch an eine dll zu linken. Die Anwendung soll nur noch die dll 'sehen'. Ich benutze Visual Studio 2008. ############ libA.lib ################## //libA.h #ifndef LIBA_H #define LIBA_H #include "dll.h" DLL void libA(); DLL void hallo(); DLL int callo(); #endif //_LIBA_H //libA.cpp #define DLL_EXPORT #include "libA.h" #include "libA2.h" #include <iostream> DLL void libA() {} DLL void hallo() { std::cout << "hallo" << std::endl; } DLL int callo() { std::cout << "callo" << std::endl; return 0; } //libA2.h #ifndef LIBA2_H #define LIBA2_H #include "dll.h" DLL void bla(); #endif //_LIBA2_H //libA2.cpp #define DLL_EXPORT #include "libA2.h" #include <iostream> DLL void bla() { std::cout << "bla" << std::endl; } ############ libB.lib ################## //libB.h #ifndef LIBB_H #define LIBB_H #include "dll.h" DLL void libB(); DLL void ballo(); DLL void add(int a, int ; #endif //LIBB_H //libB.cpp #define DLL_EXPORT #include "libB.h" #include <iostream> DLL void libB() {} DLL void ballo() { std::cout << "ballo" << std::endl; } DLL void add(int a, int { std::cout << "Ergebnis: " << a+b << std::endl; } ############ DLL.dll ################## //dll.h #ifndef DLL_H #define DLL_H #include "windows.h" #if defined DLL_EXPORT #define DLL extern "C" __declspec(dllexport) #else #define DLL extern "C" __declspec(dllimport) #endif #endif // DLL_H //dll.cpp #define DLL_EXPORT #include "libA.h" #include "libB.h" #include "libA2.h" BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } void attatchLibs(void) { libA(); libB(); //bla(); } ############ Test.exe ################## //Main.cpp #include <iostream> #include "dll.h" #include "libA.h" #include "libB.h" #include "libA2.h" int main(int argc, char* argv[]) { std::cout << "Nu gehts los:" << std::endl; hallo(); ballo(); callo(); add(5,7); bla(); system("pause"); return 0; } [/code] Im groben und ganzen Funktioniert das schon, nur ich muss in der DLL.cpp eine der Funktionen aus den libs aufrufen, damit der Linker sie an die dll linkt. Das Problem dabei ist, im Beispiel von libA.lib, dass zwar die Funktionen aus der cpp-Datei libA.cpp gelinkt werden, aber nicht die aus libA2.cpp. Ich nehm an, dass Visual Studio für jede cpp-Datei eine obj-Datei anlegt und im Linkvorgang bei der dll dann nur die obj-Datei aus der lib gelinkt wird, die benötigt wird. Was bedeutet, wenn man "//bla();" wieder einkommentiert, wird auch libA2.cpp benötigt und deshalb gelinkt. Dann lässt sich auch Test.exe kompillieren und ausführen. Dar hier gepostete Code ist natürlich nur ein Test, das eigentliche Projekt umfasst 8 libs und über 100 Funktionen, die in der dll zur Verfügung stehen sollen. Deshalb suche ich nach einer allgemeinen Lösung, am besten nur ein Linkerflag, das besagt, dass immer alles gelinkt werden soll. Denn jeden Funktionsaufruf in der dll.cpp zu schreiben ist nich nur ein riesen Aufwand, es verschlechtert auch die Wartbarkeit. Gibt es einen Weg generell alle Inhalte einer lib zu linken? Oder hat jemand eine Idee, wie man das eleganter lösen kann, als einen Aufruf in die dll.cpp zu packen? Ich hoffe mir kann geholfen werden. Vielen Dank im Voraus und LG Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. April 2010 Teilen Geschrieben 22. April 2010 Was steht denn in den Projekteinstellungen der DLL unter Linker > Optimization > References? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Reudiger Fuchs Geschrieben 22. April 2010 Autor Teilen Geschrieben 22. April 2010 Vielen Dank für die schnelle Hilfe. Da stand natürlich drin: "Standart" Ich habs auf "Daten, auf die nicht verwiesen wird, beibehalten (/OPT:NOREF)" geändert und nun geht alles, auch ohne die AttachLibraries Funktion. Vielen Dank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
frobber Geschrieben 22. April 2010 Teilen Geschrieben 22. April 2010 Ich nehm an, dass Visual Studio für jede cpp-Datei eine obj-Datei anlegt und im Linkvorgang bei der dll dann nur die obj-Datei aus der lib gelinkt wird, die benötigt wird. Was bedeutet, wenn man "//bla();" wieder einkommentiert, wird auch libA2.cpp benötigt und deshalb gelinkt. Dann lässt sich auch Test.exe kompillieren und ausführen. Diese Einschätzung ist soweit korrekt, nur das nicht libA.cpp benötigt wird, sondern der Linker in LibA.lib nach der entsprechenden Funktion sucht. Gibt es einen Weg generell alle Inhalte einer lib zu linken? Nein das geht so nicht. Du kannst keine Funktionen aus einer statischen Bibliothek durch eine DLL exportieren. Exportierte Funktionen müssen auch in der DLL definiert werden ansonsten wird der Linker auch nichts unternehmen eine Funktion zu suchen, die nie verwendet oder definiert wird . Ich sehe zwei Möglichkeiten: 1) Du kannst die .cpp Dateien der verschiedenen Bibliotheksprojekte mit in das DLL Projekt einbinden. Wenn dann die Funktionen der statischen Bibliotheken, wie von dir gezeigt mit __declspec(dllexport) deklariert sind, werden sie mit exportiert, da sie ja jetzt Bestandteil des DLL Projektes sind. 2) Du kannst aus der DLL Wrapperfunktionen exportieren, welche die Funktionen der statischen Bibliothek aufrufen. ist wohl aber eher nicht das was du willst. Leider sehe ich keine anderen Möglichkeiten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.