Ошибки Visual С++ Precompiled Headers

Update:

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


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

В Visual С++ я начал использовать предварительно скомпилированные заголовки для ускорения компиляции и определения 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"

Для выпуска и отладки у меня есть "Создать предварительно скомпилированный заголовок (/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:

Кто-нибудь знает, что происходит?

Ответ 1

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

Ответ 2

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

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

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

Подробнее о параметрах /Y см. здесь.

Ответ 3

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

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

Ответ 4

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