CMAKE - Как установить разные параметры компилятора для одного файла - PullRequest
2 голосов
/ 03 марта 2020

У меня есть файл CMAKE со следующими флагами компиляции

 set (CMAKE_CXX_FLAGS_DEBUG  "${CMAKE_CXX_FLAGS_DEBUG} \
    -fPIC -Wall -pedantic -Wextra -Werror \
    -Wno-missing-braces -Wno-unused-variable \
    -Wno-ignored-qualifiers  -fdiagnostics-color")

Я хочу опустить опцию -Wextra для отдельного заголовочного файла; /externals/include/foo.hpp (это сторонняя библиотека только для заголовков, которая выдает ошибку: [-Werror = unused-параметр] при компиляции).

Я пытался set_source_files_properties вот так

set_source_files_properties(${EXTERNALS_SOURCE_DIR}/foo.hpp PROPERTIES COMPILE_FLAGS  "${CMAKE_CXX_FLAGS_DEBUG} -Wno-extra")

, но не смог избавиться от ошибки компиляции.

Есть ли способ сделать это в CMAKE? или используя #pragmas в самом файле заголовка?

Спасибо.

РЕШЕНИЕ Вот как я избавился от ошибки:

  • Создайте файл foo_wrapper.hpp.
  • Добавьте _pragma, чтобы игнорировать флаг компиляции создателя проблемы
  • Используйте заголовок оболочки везде в проекте вместо фактического заголовка.

`// В файле foo_wrapper.hpp:

   _Pragma("GCC diagnostic push")

   _Pragma("GCC diagnostic ignored \"-Wunused-parameter\"")

   #include "foo.hpp"

   _Pragma("GCC diagnostic pop")

`

1 Ответ

1 голос
/ 03 марта 2020

На текущих компиляторах это невозможно сделать с помощью параметров сборки.

Это из-за того, как работает модель сборки: компилятор будет вызываться один раз для каждого исходного файла и всех заголовочных файлов, включенных в него. этим исходным файлом всегда будут использоваться те же параметры сборки, что и для самого исходного файла. Поэтому CMake не сможет вам здесь помочь.

Некоторые компиляторы позволяют отключать определенные предупреждения через #pragma с. Например, MSV C или g cc. Проверьте руководство вашего компилятора для того, что они предлагают в этом отношении. К сожалению, это всегда будет непереносимым, поэтому, если у вас есть кодовая база, поддерживающая множество компиляторов, #pragma s может быть длинным. Я бы порекомендовал написать заголовок-обертку, который включает только сторонний заголовок, который доставляет вам неприятности и заботится обо всех отключениях предупреждений. В ваш проект вы всегда включаете оболочку вместо оригинального стороннего заголовка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...