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