STL без CRT в MSVC 7.1
От: _nn_  
Дата: 18.06.04 12:38
Оценка: :)
Хочется использовать STL в проекте ATL, однако при подключении STL нужно еще и подключать CRT (_ATL_MIN_CRT не проходит).

Подскажите что сделать чтобы можно было использовать STL с _ATL_MIN_CRT без подключения самой CRT.

Спасибо.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: STL без CRT в MSVC 7.1
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 21.06.04 05:21
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Хочется использовать STL в проекте ATL, однако при подключении STL нужно еще и подключать CRT (_ATL_MIN_CRT не проходит).


А что именно использовать из STL? Просто в ATL есть довольно сностные контейнеры и еще немного из STL
... << Rsdn@Home 1.1.4 beta 1 >>
Re[2]: STL без CRT в MSVC 7.1
От: _nn_  
Дата: 21.06.04 17:33
Оценка:
Здравствуйте, LaFlour, Вы писали:

LF>Здравствуйте, _nn_, Вы писали:


__>>Хочется использовать STL в проекте ATL, однако при подключении STL нужно еще и подключать CRT (_ATL_MIN_CRT не проходит).


LF>А что именно использовать из STL?

Ну например такой пример:
#include <vector>
//...
vector<int> x;
x.push_back(1);

Выдается ошибка:

LIBCMT.lib(crt0dat.obj) : error LNK2005: __osplatform already defined in atlmincrt.lib(atlinit.obj)
LIBCMT.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function _mainCRTStartup
Release/fdsa.exe : fatal error LNK1120: 1 unresolved externals

LF>Просто в ATL есть довольно сностные контейнеры и еще немного из STL
Я не говорил что я против них, я их и использую, просто после после небольшого знакомства с STL мне хочется ее использовать.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: STL без CRT в MSVC 7.1
От: _nn_  
Дата: 24.06.04 07:50
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Хочется использовать STL в проекте ATL, однако при подключении STL нужно еще и подключать CRT (_ATL_MIN_CRT не проходит).


__>Подскажите что сделать чтобы можно было использовать STL с _ATL_MIN_CRT без подключения самой CRT.


__>Спасибо.


Нашлась проблема, она состоит в том что из библиотеки 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)

http://rsdn.nemerleweb.com
http://nemerleweb.com
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...
Пока на собственное сообщение не было ответов, его можно удалить.