Ошибки скомпилированных заголовков Visual 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"

Для выпуска и отладки у меня есть "Создать предварительно скомпилированный заголовок (/Yc)". Он отлично скомпилирован в режиме отладки, но в режиме выпуска он продолжает отчитываться

error LNK2005: ___@@_PchSym_@00@UfhvihUaszlaDUwlxfnvmghUnnlUhixUnnlPeDUnnlPeDUivovzhvUvmgrgbOlyq@ already defined in A.obj

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

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

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

4 ответа

Решение

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

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

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

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

Смотрите здесь для деталей о параметрах /Y.

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

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

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

Другие вопросы по тегам