Re[2]: STL без CRT в MSVC 7.1
От: quentin  
Дата: 14.06.06 07:57
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Нашлась проблема, она состоит в том что из библиотеки LIBCMT.lib импортируется функция __crtExitProcess.


__>Можно ли ее подменить под себя ?


__>Место ошибки :

__>

__>Found ___crtExitProcess
__> Referenced in LIBCMT.lib(mlock.obj)
__> Referenced in LIBCMT.lib(crt0.obj)
__> Loaded LIBCMT.lib(crt0dat.obj)
__>LIBCMT.lib(crt0dat.obj) : error LNK2005: __osplatform already defined in atlmincrt.lib(atlinit.obj)


Я в одном из своих проектов делал следующим образом:
Для частичной, скажем, "эмуляции" CRT можно использовать ATL_MIN_CRT, или LIBCTINY (от Мэтта Питрека, если мне не изменяет память),
или свою реализацию. Я использовал последний вариант.

Затем мне пришлось отключить поддержку исключений (убрать /EH{s|a}[c] для MS компилятора), а для того. чтобы использовать STL (точнее, ее конкретную реализацию, поставляемую с MS VS .NET 2003 — Dinkumware 3.13) используюется следующий код:

Перед включением заголовков STL:

#pragma warning(disable: 4530)    // C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc

#ifdef    _HAS_EXCEPTIONS
    #undef _HAS_EXCEPTIONS
#endif
#define _HAS_EXCEPTIONS    0

#ifdef    _STD_USING
    #undef _STD_USING
#endif
#define _STD_USING        0
    
#ifdef    _GLOBAL_USING
    #undef _GLOBAL_USING
#endif
#define _GLOBAL_USING    0


Потом где-нибудь в *.cpp (если были отключены исключения макросом _HAS_EXCEPTIONS)

#include <exception>

STD_BEGIN
//
//    Custom implementation of _String_base (see comment below)
//
void _CRTIMP2 _String_base::_Xlen() const    // report a length_error
{
    assert(false);
}
void _CRTIMP2 _String_base::_Xran() const    // report an out_of_range error
{    
    assert(false);
}

_STD_END


_X_STD_BEGIN

_CRTIMP2 void __cdecl _Throw(const std::exception&)
{
    assert(false);
}

typedef void (*_Prhand)(const std::exception&);

_CRTIMP2 _Prhand _Raise_handler = 0;

_X_STD_END


Если же поддержка исключений нужна в STL, а CRT — нет, то необходимы только определения макросов _GLOBAL_USING (возможно и без этого макроса, не проверял) и _STD_USING.
Best regards,
quentin a.k.a qYml
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.