Хочется использовать STL в проекте ATL, однако при подключении STL нужно еще и подключать CRT (_ATL_MIN_CRT не проходит).
Подскажите что сделать чтобы можно было использовать STL с _ATL_MIN_CRT без подключения самой CRT.
Спасибо.
Здравствуйте, _nn_, Вы писали:
__>Хочется использовать STL в проекте ATL, однако при подключении STL нужно еще и подключать CRT (_ATL_MIN_CRT не проходит).
А что именно использовать из STL? Просто в ATL есть довольно сностные контейнеры и еще немного из STL
... << Rsdn@Home 1.1.4 beta 1 >>
Здравствуйте, 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 мне хочется ее использовать.
Здравствуйте, _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)
Здравствуйте, _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.