ATL-COM Dll



  • Hallo !

    Ich habe mir eine ATL-COM Dll (ActiveX-Dll ?) geschrieben mit den Standardeinstellungen des VC Wizards. Das heißt ohne MFC Unterstützung. Nun brauchte ich in meinem Projekt aber komfortables/bequemes Stringhandling und da ich keine MFC Unterstützung "wollte" habe ich die C++ Klasse std::string (Header <string> und <iostream>, wobei ich letztere wohl wieder herausnehmen kann) eingebunden.
    In der Debug Version war alles in Ordung, aber in der Release Version meckerte der Compiler mit Warnungen und der Linker mit der Meldung LNK2001 "Nichtaufgelöstes externes "Symbol" [...] Funktion _main".

    Als Hilfestellung gab der Compiler an, dass ich in den Optionen das "Flag" /GX setzen soll.
    Das habe ich getan und auch eine minimal Version der Funktion main eingebunden.

    int main(void){ return 0; }
    

    Ab sofort waren Compiler und Linker regelrecht zufrieden, nur ich war etwas verunsichert. Kann es sein das es zu Konflikten kommt mit der Funktion main, denn die DLL hat ja schon eine Funktion DLLMain ? Imho kümmert sich eine Windows App, aber nicht um main sondern um (bei Dlls) DllMain, richtig ?

    Die Compiler /GX wird auch wohl keine Probleme bereiten, richtig ?

    P.S.: Ich frage aus Interesse und Vorsicht. Bisweilen traten keine Fehler auf und ich kann die die ActiveX Dll ohne Probleme nutzen.



  • Das Problem ist in der KB von Microsft beschrieben.

    Hier der Auszug

    [msdn]
    INFO: LNK2001 on CRT Symbols in ATL Release Build
    Die Informationen in diesem Artikel beziehen sich auf:
    This article was previously published under Q165076
    SUMMARY
    Microsoft Active Template Library COM AppWizard generates a release build of your project using macro _ATL_MIN_CRT. Selecting this configuration causes the C run-time (CRT) library startup code to not be linked into your project. If you use functions or code in your project that require the use of the C run-time library startup code, you may experience LNK2001 - unresolved external errors when you try to build the release version of your project.
    MORE INFORMATION
    You can use some C run-time functions without requiring the CRT startup code. Examples include the mem* functions. Other functions require the CRT startup code. CRT string comparisons for example require the startup code as the CRT initializes some tables used for comparing. Global objects that have constructors also require the startup code. In Visual C++ 5.0, statically linking the startup code adds about 25K to your image (in Visual C++ 4.2 it is about 20K).

    Following are some suggestions for finding the cause of the LNK2001 errors:
    In the linker options there is an "ignore libraries" edit box. Enter Libcmt.lib into it, and build. You get several unresolved externals. This list is everything that you are using from the CRT. Look for things that you think may be pulling in the startup code and remove them if you can.
    Don't ignore Libcmt.lib, but turn on the verbose flag for the linker. From this, you can see what is triggering CRT startup code to get pulled in.
    If you decide that you really need the startup code, then remove the _ATL_MIN_CRT define from the project settings. You can also dynamically link to the CRT, which reduces your image size but requires the CRT's DLL. If you turn on exception handling you have to pull in the startup code. Even when building minsize the default is to statically link to the CRT and use _ATL_MIN_CRT.
    [/msdn]

    und der Link dazu: http://support.microsoft.com/default.aspx?scid=kb;en-us;165076



  • Lösung siehe Frank - nur noch ein Tip: die WTL (http://sourceforge.net/projects/wtl/) Enthält neben ATL-kompatibler UI-Klassen auch eine MFC-kompatible CString Klasse.

    (wil dich nicht von std::strng abhalten, aber manchmal ist CString einfach schöner)


Anmelden zum Antworten