Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...