пятница, 9 ноября 2012 г.

Visual C++ Express Edition + QT4. Часть 3

вывод, что-то не хватает :(

натравливаем MOC.EXE (Meta-Object Compiler) на файлы *.h (по логике нужно натравить на все файлы). Если результат есть (сформирован файл не нулевой длины), значит этот файл .h содержал МЕТА записи, которые нужно превратить в нормальный вменяемый C/C++:

all_moc.bat
--8<---

for /R "." %%i in (*.h) do (moc.exe "%%~nxi" -o "moc_%%~ni.cpp"
for /R "." %%j in (moc_%%~ni.cpp) do if exist %%~j if "%%~zj" equ "0" del "%%j"
)
exit
--8<---



после чего все полученные файлы moc_*.cpp вставляем в проект.
компилим, получаем ошибку
------ Build started: Project: securesocketclient4, Configuration: Debug Win32 ------
  moc_sslclient.cpp
  moc_certificateinfo.cpp
  Generating Code...
main.obj : error LNK2019: unresolved external symbol "int __cdecl qInitResources_securesocketclient(void)" (?qInitResources_securesocketclient@@YAHXZ) referenced in function _main
D:\VisualC++Projects\securesocketclient4\Debug\securesocketclient4.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

внимание! теперь самая главная хитрость!!!
rcc.exe -name securesocketclient securesocketclient.qrc -o qrc_securesocketclient.cpp
без выделенной фразы файл qrc_securesocketclient.cpp будет сформирован, но проект не соберется
теперь вставляем qrc_securesocketclient.cpp в проект и компилим.

------ Build started: Project: securesocketclient4, Configuration: Debug Win32 ------
  qrc_securesocketclient.cpp
  securesocketclient4.vcxproj -> D:\VisualC++Projects\securesocketclient4\Debug\securesocketclient4.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

все собралось тип топ, но теперь выполнится ли файл?
Выполнился, но при этом держит черное консольное окно. Надо поправить.
Было:
Стало (аналогично нужно сделат для Release):

Было (для всех)

Стало (для всех)

Компилим, получаем ошибку:
------ Build started: Project: securesocketclient4, Configuration: Release Win32 ------
MSVCRT.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
D:\VisualC++Projects\securesocketclient4\Release\securesocketclient4.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Правим точку входа на mainCRTStartup согласно http://www.gamedev.net/topic/617335-compiling-a-qt-project-in-visual-studio/ (http://msdn.microsoft.com/en-us/library/f9t8842e.aspx)
Было (для всех)
Стало (для всех)



------ Build started: Project: securesocketclient4, Configuration: Release Win32 ------
  Generating code
  Finished generating code
  securesocketclient4.vcxproj -> D:\VisualC++Projects\securesocketclient4\Release\securesocketclient4.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Все работает тип-топ %)))

Так вот в чем была моя ошибка!!!
При установки точки входа в main согласно http://2lx.ru/2009/08/error-lnk2019-unresolved-external-symbol-_winmain16-referenced-in-function-___tmaincrtstartup/ я и напрыгался :((((

 я не дочитал до конца комментарии, в которых и была соль земли :(((


2. Переходим в Project Properties -> Configuration Properties -> Linker -> Advanced и вставляем в свойстве Entry Point имя main-функции (для консольных приложений это main).
А вот это не надо делать.
Entry point указывает на хитрую функцию, которая кроме всего прочего, получает аргументы из командной строки и формирует из них параметры main: argv и argc. envp тоже получает она. Если указать в качестве entry point функцию main, работать программа будет, но вот argv и argc будут, мягко говоря, недействительными.

Что собственно и приводило к тому, что в argc было 32 вместо 1, argv указывал непонятно куда...

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

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