Problem mit Lib und *.h



  • Hallo zusammen,

    ich habe erstmals versucht eine lib zu schreiben und zu verwenden.
    Leider erhalte ich den Fehler:

    preloader error LNK2019: Nicht aufgelöstes externes Symbol '"void __cdecl myfunc::google(class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > >)" (?google@myfunc@@YAXV?CStringT@DV?CStringT@DV?StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z)', verwiesen in Funktion '"public: void __thiscall CpreloaderDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CpreloaderDlg@@QAEXXZ)'

    Ich sage am besten erstmal was ich gemacht habe:

    1. die Lib als Win32-Projekt (statische Lib) mit MFC Unterstützung und vorkompilierten Headern.

    Die mycheck.h vom Projekt prex sieht so aus:

    #ifndef MFCEXT_H_
    #define MFCEXT_H_
    
    namespace myfunc
    {
    void google(CString x);
    
    }
    
    #endif // MFCEXT_H
    

    In der mycheck.cpp steht folgendes:

    #include "stdafx.h"
    #include "mycheck.h"
    
    namespace myfunc
    	{
    	void google(CString x)
    		{
    		x="lib-test!";
    		}
    
    	}
    

    In meiner Anwendung selbst definiere ich es dann so, nachdem prex.lib und mycheck.h im Projektverzeichnis gelandet sind und der Header ins Projekt
    aufgenommen wurde (prex.lib ist in den Linker eingetragen!):

    #include "mycheck.h"
    
    //dann im buttonereignis
    myfunc::google("abc");
    

    Was mache ich denn da falsch? 😕 Der Sinn der Funktion sei mal dahingestellt, es geht mir nur ums Begreifen.



  • Guten Morgen,

    habe noch eine weitere Frage.
    Wo ist der Unterschied, ob ich:

    1. nur eine DLL nutze
    2. eine dll mit lib
    oder
    3. eine lib. mit .h

    ?


  • Mod

    Versuche keine komplexen Objekte und keine Objekte die als Templates vorliegen an eine DLL zu übergeben. CString verbietet sich also. Das Problem ist dass sobald ein andere Compiler oder sogar nur ein anderes SP eingesetzt wird es evtl. kracht.

    zu 1. ohne Lib musst Du LoadLibrary und GetProcAddress verwenden. Klassen kannst Du dann z.B. nicht exportieren oder in eine Lib packen.
    zu 2. ohne Header Datei geht nichts. lib+dll alleine bringt nichts.
    zu 3. Da ist keine DLL im Spiel. Das ist statisches linken.



  • Wozu ist dann die MFC-Unterstützung bei statischem Linken noch gut?
    Dann muss man doch auch CString in ihr verwenden können?


  • Mod

    Dann hast Du die MFC Komponenten in Diner EXE. Du kannst diese Objekte dann aber nicht einfach an eine DLL weitergeben, denn dort wird für diese Objekte evtl. ein andere Code verwendet.

    Über DLL Grenzen hinweg sollten möglichst nur elementare Daten übergeben werden und in keinem Flal sollten Zeiger in einem Modul allokiert und in einem anderen freigegeben werden. Das genau aber passiert mit einem CString Objekt!



  • Hi,

    ich habe es aus einem Tutorial gezogen. Genauer gesagt von hier:

    http://www.functionx.com/visualc/libraries/mfcstaticlib.htm
    (Vielleicht hilft es mal jemandem weiter?)

    Ich nutze ja gar keine DLL sondern nehme die statische Methode (nur lib und header).

    Ist das Beispiel dann falsch, bzw. sollte man also NIE und in keinem Fall
    einen CString beim statischen linken nutzen? *verwirttsei*



  • Sorry dass ich pushe, aber ich meinte diesen Teil der Lib (siehe Link):

    namespace MFCExtensions
    {
    	BOOL IsNatural(const CString Str) //CString!!
    	{
    //..
    

  • Mod

    Wenn Du CSTring als Übergabeparameter in einer DLL verwendest, dann musst Du garantieren, dass alle Compiler Einstellungen und verwendeten SP's in beinden Programmen identisch sind. Und zwingend müssen beide Projekte die MFC als shared DLL verwenden!


Log in to reply