G CC не выполняет один раз #pragma с предварительно скомпилированными заголовками (через CMake) - PullRequest
0 голосов
/ 18 июня 2020
• 1000 1003 *

CMakeLists.txt

cmake_minimum_required( VERSION 3.16 )
project( example )
add_library( example SHARED src/example/class_a.cpp )
target_include_directories( example PRIVATE src )
target_precompile_headers( example PRIVATE src/example/pch.h )

src / example / class_a. cpp

#include "class_a.h"

src / example / class_a.h

#pragma once
class class_a { };

src / example / pch.h

#pragma once
#include <example/class_a.h>

Попытка скомпилировать проект приводит к:

[ 33%] Building CXX object CMakeFiles/example.dir/cmake_pch.hxx.gch
[ 66%] Building CXX object CMakeFiles/example.dir/src/example/class_a.cpp.o
In file included from /src/example/class_a.cpp:1:
/src/example/class_a.h:6:7: error: redefinition of ‘class class_a’
    6 | class class_a
      |       ^~~~~~~
In file included from /src/example/pch.h:2,
                 from CMakeFiles/example.dir/cmake_pch.hxx:5,
                 from <command-line>:
/src/example/class_a.h:6:7: note: previous definition of ‘class class_a’
    6 | class class_a
      |       ^~~~~~~

Если я переключу охрану #pragma once на старомодный #ifndef XX, он компилируется нормально.

Также он компилируется без ошибок, если я изменяю на "class_a.h" в файле pch.h.

Я что-то здесь делаю неправильно? Мне действительно кажется, что ag cc bug не может понять, что #pragma once означает «только один раз».

...