2009-09-09 3 views
14

Update:Визуальные ошибки C++ Скомпилированная Заголовки

Каковы эффекты, включая stdafx.h в моих файлах заголовков?


Я начал с проекта C++ в Linux/Eclipse CDT и импортировал его в Visual C++/Windows.

В Visual C++ я начал использовать предварительно скомпилированные заголовки для ускорения компиляции и определения stdafx.cpp и stdafx.h.

Вот мой stdafx.h

#pragma once 

#include <string> 
#include <vector> 
#include <map> 
... 

и мой stdafx.cpp

#include "stdafx.h" 

В каждом .h и .cpp файл, у меня есть следующие:

#pragma once //if in a header file 
#include "stdafx.h" 

Для как отпустить, так и отладить, у меня есть «Create Precompiled Header (/ Yc)». Составлен отлично в режиме отладки, но в режиме выпуска он держит отчет

error LNK2005: [email protected]@[email protected]@U[email protected] already defined in A.obj 

Если я включаю как в «Использование предварительно скомпилированных заголовков», я получаю как в Debug и Release

fatal error C1854: cannot overwrite information formed during creation of the precompiled header in object file: 

Кто-нибудь знает, что это продолжается?

+0

Кстати, я создал новый тестовый проект и сравнил его настройки PCH с моим. Его настройками были Use PCH. Этот проект каким-то образом составлен. – jameszhao00

ответ

30

Вы помещаете «создать предварительно скомпилированный заголовок» только для stdafx.cpp. Затем «используйте предварительно скомпилированный заголовок» для всех других файлов «.cpp». Наконец, есть include "stdafx.h" в начале каждого файла «.cpp» (как правило, не в заголовочных файлах.

+0

Я могу установить только конфигурационный файл PCH или Use PCH. – jameszhao00

+10

В VS вы можете щелкнуть правой кнопкой мыши по отдельному файлу и выбрать «свойства». Затем в разделе «C++ -> Предварительно скомпилированные заголовки» вы можете установить значение «create» или «use». Конфигурационная конфигурация используется по умолчанию - вы должны, вероятно, установить это для использования, а затем переопределить ее для stdafx.cpp –

+0

Итак, каковы эффекты включения stdafx.h в мои файлы заголовков? – jameszhao00

4

Вы ставите #pragma once перед #include "stdafx.h", который, по моему мнению, вызывает компилятор, игнорирующий директиву #pragma once.

Кроме того, я не думаю, что вы должны помещать строку #include "stdafx.h" в файлы заголовков вообще.

+2

Yup, вы обычно помещаете #include "stdafx.h" в качестве первого include из каждого .cpp-файла. Я думаю, что это может быть первая строка без комментариев. –

+1

Итак, в основном я должен включать свои собственные файлы заголовков в PCH? Как насчет того, чтобы скомпилировать заголовки (boost), указанные в моих собственных заголовках? – jameszhao00

+2

Например, если я ссылаюсь на Boost как в stdafx, так и в my_class.h, в my_class.cpp Boost, на который ссылается в my_class.h, будет пропущен, потому что stdafx уже ссылался на него? – jameszhao00

6

Опция /Yc компилятор используется для создания предварительно скомпилированных заголовков для действий компиляции. Опция /Yu инструктирует компилятор использовать предварительно скомпилированный заголовок.

Вы всегда будете использовать опцию /Yu в настройках проекта. в страницах свойств для файла stdafx.cpp, параметр /Yc будет установлен.

важно понимать, что есть отдельные варианты компиляции для каждого .cpp файл .

Для получения подробной информации о параметрах/Y см. here.

+1

А я вижу. Благодарю. – jameszhao00

1

Результаты использования «stdafx.h» не зависят от системы PreCompiled Header. Если вы отключите Create PCH/Use PCH, код компилирует и создает тот же результат, за исключением того, что он работает медленнее.Вот почему вы можете использовать его в переносном коде (в отличие от #pragma once)