Почему объект создается также, при создании предварительно скомпилированного заголовка? - PullRequest
2 голосов
/ 10 июня 2011

Я хочу создать .pch в файле make.cl / nologo / c /YcPrecompiled.hpp /FpPrecompiled.pch Precompiled.cpp

Что меня смутило: почему эта команда также создает объект с именем Precompiled.obj

Должен ли я связать этот объект сфинал exe?

После поиска в Интернете я нашел учебник по msdn: http://msdn.microsoft.com/en-us/library/d9b6wk21(v=VS.71).aspx Я не могу понять одну строку:

$(CPP) $(CLFLAGS) /Yc$(BOUNDRY)    applib.cpp myapp.cpp

При созданииpch, зачем нужны applib.cpp и myapp.cpp.И это также создает два объекта, applib.obj, myapp.obj, кроме файла .pch .... Почему?

Любые указания приветствуются.Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 05 ноября 2014

MSDN упоминает об этом, по крайней мере, в других 2 местах :

STDAFX.CPP, STDAFX.H: Эти файлы используются для создания предварительно скомпилированного заголовочного файла. PROJNAME.PCH и файл скомпилированных типов STDAFX.OBJ.

Это описание действительно не проводит четкого различия между предварительно скомпилированным заголовком и предварительно скомпилированными типами. Запустив dumpbin на типичном stdafx.obj из проекта MFC, вы увидите, что он содержит целую кучу статических типов ATL, определение которых находится где-то глубоко в дереве включения:

     ...
     COMDAT; sym= "struct ATL::IAtlAutoThreadModule * ATL::_pAtlAutoThreadModule" (?_pAtlAutoThreadModule@ATL@@3PEAUIAtlAutoThreadModule@1@EA)
     COMDAT; sym= "public: static int const ATL::AtlLimits<int>::_Min" (?_Min@?$AtlLimits@H@ATL@@2HB)
     COMDAT; sym= "public: static int const ATL::AtlLimits<int>::_Max" (?_Max@?$AtlLimits@H@ATL@@2HB)
     COMDAT; sym= "public: static unsigned int const ATL::AtlLimits<unsigned int>::_Min" (?_Min@?$AtlLimits@I@ATL@@2IB)
     COMDAT; sym= "private: static int (__cdecl* ATL::CNoUIAssertHook::s_pfnPrevHook)(int,char *,int *)" (?s_pfnPrevHook@CNoUIAssertHook@ATL@@0P6AHHPEADPEAH@ZEA)
     COMDAT; sym= "public: static bool ATL::CAtlBaseModule::m_bInitFailed" (?m_bInitFailed@CAtlBaseModule@ATL@@2_NA)
     COMDAT; sym= "public: static unsigned short const ATL::CVarTypeInfo<char>::VT" (?VT@?$CVarTypeInfo@D@ATL@@2GB)
     COMDAT; sym= "public: static char tagVARIANT::* ATL::CVarTypeInfo<char>::pmField" (?pmField@?$CVarTypeInfo@D@ATL@@2QEQtagVARIANT@@DEQ3@)
     COMDAT; sym= "public: static unsigned short const ATL::CVarTypeInfo<unsigned char>::VT" (?VT@?$CVarTypeInfo@E@ATL@@2GB)
     ...

Какой тип имеет смысл - если вы определяете статическую переменную в pch, другого разумного места для ее добавления нет.

0 голосов
/ 10 июня 2011

Поскольку вы пытаетесь сделать это в make-файле, я бы попытался следовать шаблону, предложенному в этом руководстве (который одинаков вплоть до VS2010 в MSDN). Так Microsoft хочет, чтобы вы обрабатывали генерирование PCH в make-файлах, да?

То, как вы это делаете, не дает правильных результатов - вы не должны видеть файл OBJ для PCH. Сделайте так, чтобы ваш make-файл соответствовал модели Microsoft, и, возможно, у вас все будет в порядке.

Относительно необходимости кодировать файлы в командной строке make-файла для компиляции PCH - в этом учебном пособии есть немного больше смысла в других местах здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...