Bibliothek (*.lib) aus einer abgeleiteten MFC-Klasse erstellen
-
Guten Morgen,
Ich schreibe gerade an einem Programm, in dem ich viele abgeleitete Klassen benötige, da z.B. CListCtrl nicht alle Funktionen aufweist die ich gerne hätte.
Also leite ich die Klasse ab -> CListCtrlEx.
Da ich in Zukunft auch noch weitere Projekte starten möchte, möchte ich soweit es geht die Klasse generalisiert lassen, um ggf. die Klasse dort erneut zu verwenden.
Die Funktionen sind recht simple gehalten, wie z.b. bei AddColumn eine automatische Spalten anpassung usw.Mein Problem ist nun folgenes. Ich möchte ähnlich wie bei der MFC eine Art Bibliothek von meinen eigenen entworfenen Klassen erstellen. D.h. ich habe einen Ordner z.B. "MyIncludes". Dort befinden sich die Header-Dateien mit den dazugehörigen Lib-Dateien. Starte ich nun ein neues Projekt, möchte ich die Header in der stdafx.h einbinden und, falls nötig, die Lib in den Linkeropionen angeben.
Wie stelle ich das an? Eine DLL möchte ich ja nicht erstellen und dazu habe ich bereits haufenweise Themen gefunden, aber konkret wie man sich nur eine auf LIB beschränk ist leider nicht zu finden.
Vielen Dank im Voraus
-
Das ist nichts gheimnisvolles. Der Projekt Wizard hilft Dir dabei.
In jedem Fall musst Du für jeden Projekttyp eine eigene Lib erzeugen. Debug/Release, macht schon zwei. Wenn Du unterschiede in Unicode/MBCS machst hast Du 4. Wenn Du jetzt noch zwischen statischer und dynamischer MFC unterscheidest hättest Du wieder doppelt so viele.
Entsprechend solltest Du die LIBs benennen. U am Ende für Unicode. S für statisch etc.
In den Header kannst Du entsprechend gleich ein #pragma comment(lib,"libname.lib") einbauen und damit sparst Du die die Anpassung der Linker OPptionen in Deinen Projekten.
-
Der Projekt Wizard hilft Dir dabei
Martin, welchen Projekttyp wählst Du denn aus? Ich hätte jetzt vermutet "Klassenbibliothek", aber da entsteht auch eine DLL und die ganze MFC muss man außerdem hinzufügen.
-
Win32 -> Win32 Porject -> Static Library
-
Danke Martin, manchmal ist man blind.
-
Hallo,
um das jetzt nochmal nach zuvollziehen.
1. Ich erstelle eine Win32 Static Bibliothek.
2. Dabei wähle ich MFC unterstützung an
3. Kopiere meine Klasse hinein
4. Kompiliere das Ganze
5. Ich include die Header und binde mit #pragma comment(lib,"libname.lib") die lib ein
6. Kompiliere das gesamte ProjektIst das soweit richtig?
Also wenn ich das so mache bekomme ich folgene Linker-Fehler:
CListCtrlEx.lib(ListCtrlEx.obj) : Es wurde ein mit /GL kompiliertes MSIL .netmodule oder module gefunden. Verknüpfung wird mit /LTCG erneut gestartet. Fügen Sie /LTCG zur Verknüpfungsbefehlszeile hinzu, um die Verknüpfungsleistung zu erhöhen. LINK : warning LNK4075: /INCREMENTAL wird aufgrund der Angabe von /LTCG ignoriert. CListCtrlEx.lib(ListCtrlEx.obj) : error LNK2005: "public: unsigned long __thiscall CListCtrl::SetExtendedStyle(unsigned long)" (?SetExtendedStyle@CListCtrl@@QAEKK@Z) ist bereits in nafxcwd.lib(winctrl6.obj) definiert. CListCtrlEx.lib(ListCtrlEx.obj) : error LNK2005: "public: int __thiscall CHeaderCtrl::GetItemCount(void)const " (?GetItemCount@CHeaderCtrl@@QBEHXZ) ist bereits in nafxcwd.lib(winctrl2.obj) definiert. CListCtrlEx.lib(ListCtrlEx.obj) : error LNK2005: "public: int __thiscall CListCtrl::SetColumnWidth(int,int)" (?SetColumnWidth@CListCtrl@@QAEHHH@Z) ist bereits in nafxcwd.lib(winctrl2.obj) definiert. CListCtrlEx.lib(ListCtrlEx.obj) : error LNK2005: "protected: virtual void __thiscall CWnd::DoDataExchange(class CDataExchange *)" (?DoDataExchange@CWnd@@MAEXPAVCDataExchange@@@Z) ist bereits in nafxcwd.lib(afxinl3.obj) definiert. CListCtrlEx.lib(ListCtrlEx.obj) : error LNK2005: "public: virtual void __thiscall CObject::Serialize(class CArchive &)" (?Serialize@CObject@@UAEXAAVCArchive@@@Z) ist bereits in nafxcwd.lib(afxinl1.obj) definiert. CListCtrlEx.lib(ListCtrlEx.obj) : error LNK2005: "public: virtual void __thiscall CWnd::BeginModalState(void)" (?BeginModalState@CWnd@@UAEXXZ) ist bereits in nafxcwd.lib(afxinl3.obj) definiert. CListCtrlEx.lib(ListCtrlEx.obj) : error LNK2005: "public: virtual void __thiscall CObject::AssertValid(void)const " (?AssertValid@CObject@@UBEXXZ) ist bereits in nafxcwd.lib(objcore.obj) definiert. CListCtrlEx.lib(ListCtrlEx.obj) : error LNK2005: "public: virtual void __thiscall CObject::Dump(class CDumpContext &)const " (?Dump@CObject@@UBEXAAVCDumpContext@@@Z) ist bereits in nafxcwd.lib(objcore.obj) definiert. CListCtrlEx.lib(ListCtrlEx.obj) : error LNK2005: "public: virtual void __thiscall CWnd::EndModalState(void)" (?EndModalState@CWnd@@UAEXXZ) ist bereits in nafxcwd.lib(afxinl3.obj) definiert. CListCtrlEx.lib(ListCtrlEx.obj) : error LNK2005: "public: __thiscall CListCtrl::CListCtrl(void)" (??0CListCtrl@@QAE@XZ) ist bereits in nafxcwd.lib(winctrl2.obj) definiert. CListCtrlEx.lib(ListCtrlEx.obj) : error LNK2005: "public: static void __stdcall CObject::operator delete(void *)" (??3CObject@@SGXPAX@Z) ist bereits in nafxcwd.lib(afxmem.obj) definiert. msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) ist bereits in libcmtd.lib(typinfo.obj) definiert. msvcrt.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) ist bereits in libcmtd.lib(typinfo.obj) definiert. nafxcwd.lib(nolib.obj) : warning LNK4098: Standardbibliothek "mfc80u.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden. nafxcwd.lib(nolib.obj) : warning LNK4098: Standardbibliothek "mfcs80u.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden. libcmtd.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.Passiert aber nur, wenn ich in der statischen Bibliothek eine öffentliche DLL der MFC verwende... bei einer statisch gelinkten bekomme ich 742 Fehler, da alles schon definiert ist, da mein Hauptprojekt auch die statisch gelinkte MFC DLL benutz.
-
Bei mir funktioniert es -auch mit einer öff. DLL, allerdings habe ich die LIB so dem Projekt hinzugefügt (Punkt 5), wie ich es auch mit anderen Bilbliotheken gemacht habe.
-
Deine Projekteinstellungen sind mit Sicherheit für LIB und EXE nicht identisch!
-
Also das stimmt schon. Ich habe in meinem Hauptprogramm eine MFC-Applikation als Assistent-Typ ausgewählt. Wie weit muss ich dann die Win32 Lib in den Projekt-Einstellungen abändern? Das Lib-Projekt ist eine Win32 Lib die MFC unterstützt und eine vorkompilierte Header-Datei, in der ich zusätzlich noch die afxcmn.h eingebunden habe, da er sonst CListCtrl ja nicht findet.
Es ist klar, dass wenn er die MFC statisch in die Lib einbindet und das gesamte Paket noch einmal in die EXE, dass alle MFC Komponenten doppelt vorkommen.
Die Lib ist auch 1.6 MB groß, was eig. viel zuviel ist. Ohne MFC kann ich aber keine Klasse von CListCtrl ableiten...[EDIT]
So, also ich habs nun hinbekommen. Es war nur eine kleine Umstellung in den Projekteinstellungen nötig...
Alle Konfigurationen -> Allgemein
Dann unter Projektstandards -> Zeichensatz ( z.B. Multi-Byte-Zeichensatz )
Wenn die Werte nicht übereinstimmen passt das ganze!
[/EDIT]Vielen Dank für eure Hilfe!