Здравствуйте, SkySandy, Вы писали:
SS>На только что установленный Windows, установил Visual C++ Toolkit и WTL. При компиляции ругается что не находит atlbase.h. SS>Что еще нужно на компьютер установить, что бы откомпилировать проект использующий WTL с помощью Microsoft Visual C++ Toolkit?
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>Здравствуйте, Andir, Вы писали:
A>>PSDK
SDB>Там есть "бесплатная" версия ATL — в папке Win64, кажется.
Спасибо за ответ, но получается следующее:
Установил: Platform SDK, последнюю версию.
Файл atlbase.h в ней существует в 2-х каталогах:
(1). Microsoft SDK\src\mfc\atlbase.h датирован 15.08.2001
(2). Microsoft SDK\include\Win64\atl\ atlbase.h датирован 21.08.2002
Если компилировать с (1) файлом, то возникает ошибки
atlbase.h(834) : error C2065: 'T' : undeclared identifier
atlbase.h(834) : error C2955: 'ATL::_NoAddRefReleaseOnCComPtr' : use of class template requires template argument list atlbase.h(486) : see declaration of 'ATL::_NoAddRefReleaseOnCComPtr'
Заглянув в 834 строку видим: NoAddRefReleaseOnCComPtr<T>* operator->() const
А в 486 строке:
template <class T>
class _NoAddRefReleaseOnCComPtr : public T
{
private:
STDMETHOD_(ULONG, AddRef)()=0;
STDMETHOD_(ULONG, Release)()=0;
};
Если компилировать с (2) файлом (то есть с последней по дате версией из каталога Win64), то компиляция проходит без ошибок, но в момент link ругается что не находит:
.obj : error LNK2019: unresolved external symbol __imp__DeleteDC@4 referenced i
function "public: __thiscall WTL::CDCT<1>::~CDCT<1>(void)" (??1?$CDCT@$00@WTL@
QAE@XZ)
Как я понимаю, дело уже в самой библиотеке WTL в файле atlgdi.h в строках, где описывается класс: CDCT
Что можно придумать, как все-таки откомпилировать WTL с помощью: Visual C++ Toolkit 2003?
Здравствуйте, avbochagov, Вы писали:
A>Здравствуйте, SkySandy, Вы писали:
SS>>Что можно придумать, как все-таки откомпилировать WTL с помощью: Visual C++ Toolkit 2003?
A>Может тебе протсот весь ATL на мыло бросить (от VS 2003)?
Нет, спасибо, с ATL от VS 2003 компилируется все нормально.
Просто мне хотелось создать лицензионно чистую программу:
1. Бесплатный компилятор: Visual C++ Toolkit 2003
2. Бесплатная библиотека: WTL
Но вот облом, к ним всем нужна ATL без которой программа не компилируется.
И вот эту самую ATL можно и найти в составе VS 2003, которую покупать нужно.
Теперь то ясно, почему Microsoft так расщедрился...
Здравствуйте, SkySandy, Вы писали:
SS>Установил: Platform SDK, последнюю версию.
SS>Файл atlbase.h в ней существует в 2-х каталогах: SS>(1). Microsoft SDK\src\mfc\atlbase.h датирован 15.08.2001 SS>(2). Microsoft SDK\include\Win64\atl\ atlbase.h датирован 21.08.2002
SS>Если компилировать с (2) файлом (то есть с последней по дате версией из каталога Win64), то компиляция проходит без ошибок, но в момент link ругается что не находит:
SS>.obj : error LNK2019: unresolved external symbol __imp__DeleteDC@4 referenced i SS> function "public: __thiscall WTL::CDCT<1>::~CDCT<1>(void)" (??1?$CDCT@$00@WTL@ SS>QAE@XZ)
SS>Как я понимаю, дело уже в самой библиотеке WTL в файле atlgdi.h в строках, где описывается класс: CDCT
А я так понимаю, что дело в отсутствии у линкера библиотеки импорта Gdi32.Lib, где есть "ссылка" на функцию DeleteDC. Вы уверенны, что Ваш проект содержит все необходимые настройки?
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>Еще вопрос — с последней версией WTL (7.5.4133.0) та же беда?
Да, действительно, при указании gdi32.lib программа компилируется и получается exe файл… Но…
EXE файл сразу после запуска вылетает с ошибкой General Protection Fault!!! Начал разбираться. Сравнил файл atlbase.h из поставки VS2003 и из поставки Platform SDK. Оказалось, что в файле из VS2003 есть такие строки:
Хорошо, при компиляции определил _ATL_DLL. Но в момент Link потребовался файл: atl.lib, который как оказалось, с Platform SDK поставляется только для 64 разрядной версии Windows. Для 32 разрядной версии Windows файлы atl.lib или atls.lib вместе с Platform SDK не поставляются!!!! Соответственно и откомпилировать создать приложение с ATL для них не возможно.
Попробовал взять файлы *.h из Platform SDK, а atl*.lib из VS2003 (разумеется добавив строки #pragma в файл atlbase.h) откомпилировал и программа заработала!!!
Так что уточняю:
Без покупки Visual Studio откомпилировать программу содержащую:
1. Бесплатную WTL библиотеку
2. С помощью бесплатного Visual C++ Toolkit 2003
3. При наличии бесплатного Platform SDK
для 32 разрядной версии Windows не представляется возможным!!!
Для 64 разрядной версии Windows это возможно, так как в Platform SDK для нее присутствуют файлы atl*.lib.
Здравствуйте, SkySandy, Вы писали:
SS>Без покупки Visual Studio откомпилировать программу содержащую:
SS>1. Бесплатную WTL библиотеку SS>2. С помощью бесплатного Visual C++ Toolkit 2003 SS>3. При наличии бесплатного Platform SDK
SS>для 32 разрядной версии Windows не представляется возможным!!!
SS>Для 64 разрядной версии Windows это возможно, так как в Platform SDK для нее присутствуют файлы atl*.lib.
atl.lib — это библиотека импорта для atl.dll. Отсюда возникают вопросы:
1. Есть ли у вас "в комплекте" файл atl.dll? Если да, то можно попробовать изготовить требуемую библиотеку импорта самостоятельно.
2. Усть ли у вас "в комплекте" файл atl.def (в сорцах 32-битной версии ATL). Если да, то задача упрощается до предела — lib.exe умеет генерить библиотеки импорта по def-файлам.
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>Здравствуйте, SkySandy, Вы писали:
SS>>Без покупки Visual Studio откомпилировать программу содержащую:
SS>>1. Бесплатную WTL библиотеку SS>>2. С помощью бесплатного Visual C++ Toolkit 2003 SS>>3. При наличии бесплатного Platform SDK
SS>>для 32 разрядной версии Windows не представляется возможным!!!
SS>>Для 64 разрядной версии Windows это возможно, так как в Platform SDK для нее присутствуют файлы atl*.lib.
SDB>atl.lib — это библиотека импорта для atl.dll. Отсюда возникают вопросы:
SDB>1. Есть ли у вас "в комплекте" файл atl.dll? Если да, то можно попробовать изготовить требуемую библиотеку импорта самостоятельно.
SDB>2. Усть ли у вас "в комплекте" файл atl.def (в сорцах 32-битной версии ATL). Если да, то задача упрощается до предела — lib.exe умеет генерить библиотеки импорта по def-файлам.
Мной проводился “чистый” эксперимент.
1. Установлена виртуальная машина VMware
2. На нее установлена Windows XP SP1
3. Инсталлирован Visual C++ Toolkit 2003
4. Инсталлирован Microsoft Platform SDK February 2003
В каталоге src\atl находятся исходники atl.dll и соответственно есть файл atl.def
Вопросы:
1. Как из этого сделать atl.lib файл?
2. Почему программа откомпилировалась и слинковалась без ошибок, когда у меня не было файла atl.lib, но работать не захотела (ошибка защиты). Разве она не должна была выругаться в момент link?
Здравствуйте, SkySandy, Вы писали:
SS>В каталоге src\atl находятся исходники atl.dll и соответственно есть файл atl.def
SS>Вопросы: SS>1. Как из этого сделать atl.lib файл?
link -lib /DEF:atl.def /MACHINE:IX86 /OUT:atl.lib
SS>2. Почему программа откомпилировалась и слинковалась без ошибок, когда у меня не было файла atl.lib, но работать не захотела (ошибка защиты). Разве она не должна была выругаться в момент link?
Потому что библиотека импорта при "отключенной" директиве _ATL_DLL попросту не требуется: