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