Компиляция WTL с помощью Visual C++ Toolkit
От: SkySandy  
Дата: 02.07.04 21:36
Оценка:
Добрый день!

На только что установленный Windows, установил Visual C++ Toolkit и WTL. При компиляции ругается что не находит atlbase.h.

Что еще нужно на компьютер установить, что бы откомпилировать проект использующий WTL с помощью Microsoft Visual C++ Toolkit?
Re: Компиляция WTL с помощью Visual C++ Toolkit
От: Andir Россия
Дата: 03.07.04 04:31
Оценка:
Здравствуйте, SkySandy, Вы писали:

SS>На только что установленный Windows, установил Visual C++ Toolkit и WTL. При компиляции ругается что не находит atlbase.h.

SS>Что еще нужно на компьютер установить, что бы откомпилировать проект использующий WTL с помощью Microsoft Visual C++ Toolkit?

PSDK

С Уважением, Andir!
<< using(RSDN@Home 1.1.4 beta 2){/* Работаем */} >>
Re[2]: Дополню
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 03.07.04 08:43
Оценка:
Здравствуйте, Andir, Вы писали:

A>PSDK


Там есть "бесплатная" версия ATL — в папке Win64, кажется.
- Искренне ваш, Поросенок Пафнутий
Re[3]: Дополню
От: SkySandy  
Дата: 04.07.04 07:30
Оценка:
Здравствуйте, 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?
Re[4]: Дополню
От: avbochagov Россия  
Дата: 05.07.04 10:21
Оценка:
Здравствуйте, SkySandy, Вы писали:

SS>Что можно придумать, как все-таки откомпилировать WTL с помощью: Visual C++ Toolkit 2003?


Может тебе протсот весь ATL на мыло бросить (от VS 2003)?
... << Rsdn@Home 1.1.4 beta 1 >>
Re[5]: Дополню
От: SkySandy  
Дата: 05.07.04 19:07
Оценка:
Здравствуйте, 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 так расщедрился...
Re[4]: Дополню
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 06.07.04 05:16
Оценка:
Здравствуйте, 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. Вы уверенны, что Ваш проект содержит все необходимые настройки?
- Искренне ваш, Поросенок Пафнутий
Re[5]: Дополню
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 06.07.04 05:39
Оценка:
Еще вопрос — с последней версией WTL (7.5.4133.0) та же беда?
- Искренне ваш, Поросенок Пафнутий
Re[6]: Дополню
От: SkySandy  
Дата: 07.07.04 08:07
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Еще вопрос — с последней версией WTL (7.5.4133.0) та же беда?


Да, действительно, при указании gdi32.lib программа компилируется и получается exe файл… Но…

EXE файл сразу после запуска вылетает с ошибкой General Protection Fault!!! Начал разбираться. Сравнил файл atlbase.h из поставки VS2003 и из поставки Platform SDK. Оказалось, что в файле из VS2003 есть такие строки:

#ifndef _ATL_NO_DEFAULT_LIBS
#if defined(_ATL_DLL)
#pragma comment(lib, "atl.lib")
#endif
#ifdef _DEBUG
#pragma comment(lib, "atlsd.lib")
#else
#pragma comment(lib, "atls.lib")
#ifdef _ATL_MIN_CRT
#pragma comment(lib, "atlmincrt.lib")
#endif
#endif
#endif // !_ATL_NO_DEFAULT_LIBS

А в файле из поставки Platform SDK:

#if defined(_ATL_DLL)
#pragma comment(lib, "atl.lib")
#endif

Хорошо, при компиляции определил _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.

P.S. Кстати только что обратил внимание на один из вопросов (датированный 4.07.2004) в http://groups.yahoo.com/group/wtl

WTL is in a public domain now, but is it also the case for ATL (WTL won't work without it) is there any equivalent to the MS ATL ?

Который так и остался без ответа …
Re[7]: Дополню
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 07.07.04 08:29
Оценка:
Здравствуйте, 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-файлам.
- Искренне ваш, Поросенок Пафнутий
Re[8]: Дополню
От: SkySandy  
Дата: 07.07.04 20:28
Оценка:
Здравствуйте, 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?
Re[9]: Дополню
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 08.07.04 04:55
Оценка:
Здравствуйте, 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 попросту не требуется:

#if defined(_ATL_DLL)
#pragma comment(lib, "atl.lib")
#endif


А вот насчет "ошибки защиты" — .
- Искренне ваш, Поросенок Пафнутий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.