Форум программистов, компьютерный форум, киберфорум
Кроссплатформенная разработка
Войти
Регистрация
Восстановить пароль
 
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,211
1

mingw pch.hpp.gch/.c++: not used because `__cpp_static_assert' defined as ` 201411' not ` 200410' [-Werror=invalid-pch]

21.05.2020, 23:02. Показов 9974. Ответов 0

добрый вечер.

Windows 10,
QtCreator 4.12.0 based on QT 5.14.2 (msvc2017-32)
mingw810 - родной, шел в поставке с QtCreator.
cmake 3.17.2

проект успешно собирается.
но я захотел добавить поддержку предварительно скомпилированного заголовка.

велосипед изобретать не хотелось,
поэтому решил использовать готовое решение из интернета: PrecompiledHeader.cmake

с первого раза скрипт не завёлся.
для компиляторов Visual Studio я его уже пропатчил.

теперь вот для mingw нужно пропатчить.

что это за странная ошибка?
Код
cc1plus.exe:-1: error: error: C:/projects/build-cmdenv-mingw810_32-Release/cmdenv_pch/pch.hpp.gch/.c++: not used because `__cpp_static_assert' defined as ` 201411' not ` 200410' [-Werror=invalid-pch]
QtCreator ещё ниже красным приписывает:
Код
File not found: cc1plus.exe
кто нибудь сталкивался с чем нибудь подобным?

Добавлено через 1 час 21 минуту
проблему решил.

что бы понять в чем тут соль, нужно ещё раз внимательно глянуть на диагностику:
Цитата Сообщение от hoggy Посмотреть сообщение
`__cpp_static_assert' defined as ` 201411' not ` 200410'

здесь __cpp_static_assert - это макрос препроцессора.
значение макроса зависит от используемого стандарта компилятора:
http://www.open-std.org/jtc1/S... n4440.html

суть в том, что бесчеловечный скрипт PrecompiledHeader.cmake
сначала осуществляет сборку предварительно скомпилированного заголовка,
а затем хочет слинковать полученный артефакт с остальным проектом.

однако на этапе линковки внезапно выясняется,
что значения этого макроса у проекта,
и у предварительно скомпилированного заголовка различны.

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


в общем это адовый костыль.
сделать поддержку предварительно скомпилированных загловков для gcc
на языке cmake оказалась задачей нетривиальной.

разработчики Ogre3D так написали об этом:

Код
    # disabled because it seems to increase compile time
    ## this is some serious hack... we definitely need native 
    ## support in CMake for this!
    ## we will generate the precompiled header via a workaround
хорошая новость в том, что время не стоит на месте,
и оказывается в последних версиях cmake уже запили поддержку.
да ещё какую!

очень удобно пользоваться:

Код
target_precompile_headers(target_name PRIVATE
  "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/source/pch.hpp>"
)
что бы не вникать в представленную выше кракозябру:
просто указываем абсолютный путь к хэдеру.
если путь будет относительный, тогда он будет преобразован
к абсолютному относительно каталога с исходниками: ${CMAKE_CURRENT_SOURCE_DIR}


далее cmake проворачивает вот такой фокус:
в каталоге сборки он создаёт волшебные файлы:

Код
CMakeFiles/cmdenv.dir
  |--- debug/cmake_pch.hxx
  |--- release/cmake_pch.hxx
   `-- cmake_pch.cxx
где файл cmake_pch.hxx и есть настоящий предварительно скомпилированный заголовок.
он представляет собой мостик к заголовку проекта.

его содержимое:

C++
1
2
3
4
5
6
/* generated by CMake */
 
#pragma system_header
#ifdef __cplusplus
#include "C:/projects/cmdenv/source/pch.hpp"
#endif // __cplusplus
гениальное и очень простое решение, я считаю.
поддержка предварительного заголовка полностью прозрачна для проекта.

не нужно в каждом cpp файле вручную прописывать #include "stdafx.h"
и не нужно вручную создавать stdafx.cpp
2
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2020, 23:02
Ответы с готовыми решениями:

Содержимое pch.h
На какие файлы должны быть, рекомендуется или принято делать ссылки в pch.h Спасибо.

Греется диод PCH
Здравствуйте. Ноутбук Clevo w150er (Покупался под названием DNS (0164800) (HD+)) Проблема:...

Pch.h: No such file or directory
Решил начать изучать С++, нашёл вроде годный и свежий набор уроков по нему, скачал последнюю версию...

Особенности while (pch != NULL)
Здравствуйте! Подскажите, почему пример ниже завершается ошибкой? Ведь если pch == NULL, то запись...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2020, 23:02

Диод PCH Температура
Вечер добрый. У меня стоит Материнская плата MSI MPG X570 Gaming Edge WiFi и в простое Диод PCH ...

Максимальная температура моста Pch?
какая макс. критич. темп. моста мат платы? 50 в простое в айде

HP Envy m6-1272er, греется диод PCH
здравствуйте. имеется данный ноутбук. почти сразу после покупки заметил, что греется корпус слева...

В чём разница между pch.h и stdfx.h
Недавно переустановил Windows и возникла проблема. Когда заново установил visuals studio,то пропал...

Диод PCH обжигает, ноутбук тормозит
Ноутбук Dell Inspiron 3521. Начал греться диод PCH, даже в режиме простоя ноутбук теплый, диод...

AsRock B85M-HDS температура диод PCH
Добрый день ув. форумчане. Собрал себе новый компьютер и не могу понять температура в норме или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.