среда, 4 июля 2012 г.

MinGW + POCO. Часть 2

В очередной раз убеждаюсь что для того чтобы опенсорсовские исходники заработали, необходимо приложить "драчильный напильник".

Скачал пример HTTP сервера на POCO http://poco.roundsquare.net/downloads/HTTPServer.zip
И попытался скомпилировать на QT Creator + MinGW

Получил ошибку
D:/QtSDK/mingw/lib//libmingw32.a(main.o):main.c:(.text+0x104): undefined reference to `WinMain@16'


Угрохал 3 часа на выявления причин.

Оказалось что в файле ...\Foundation\include\Poco\Config.h
прописано явно

// Define to enable Windows Unicode (UTF-8) support
#define POCO_WIN32_UTF8

что приводит в ...\Util\include\Poco\Util\ServerApplication.h 
//
// Macro to implement main()
//
#if defined(_WIN32) && defined(POCO_WIN32_UTF8)
#define POCO_SERVER_MAIN(App) \
int wmain(int argc, wchar_t** argv) \
{ \
App app; \
return app.run(argc, argv); \
}
#elif defined(POCO_VXWORKS)
#define POCO_SERVER_MAIN(App) \
int pocoSrvMain(const char* appName, ...) \
{ \
std::vector<std::string> args; \
args.push_back(std::string(appName)); \
va_list vargs; \
va_start(vargs, appName); \
const char* arg = va_arg(vargs, const char*); \
while (arg) \
{ \
args.push_back(std::string(arg)); \
arg = va_arg(vargs, const char*); \
} \
va_end(vargs); \
App app; \
return app.run(args); \
}
#else
#define POCO_SERVER_MAIN(App) \
int main(int argc, char** argv) \
{ \
App app; \
return app.run(argc, argv); \
}
#endif

к формированию через POCO_SERVER_MAIN(...)

функции int wmain(int argc, wchar_t** argv) вместо int main(int argc, char** argv)которую MinGW упорно ожидает увидеть.


Решение проблемы
1) Закомментировать #define POCO_WIN32_UTF8 в Config.h и отключить -DUNICODE
т.к. все равно в ...\Foundation\include\Poco\Platform_WIN32.h стоит взведение POCO_WIN32_UTF8

// Unicode Support
#if defined(UNICODE) && !defined(POCO_WIN32_UTF8)
#define POCO_WIN32_UTF8
#endif
но если первое еще можно пережить, то второе может привести к непредсказуемым последствиям.


2) Резать (вернее вшивать) по живому ...\Util\include\Poco\Util\ServerApplication.h, что я и предлагаю сделать:

//
// Macro to implement main()
//
#if defined(_WIN32) && defined(POCO_WIN32_UTF8) && (!defined(__MINGW__) && !defined(__MINGW32__))
Нужно добавить то, что отмечено зеленым цветом, после чего проект собирается вполне адекватно.




Комментариев нет:

Отправить комментарий