首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cmake target_precompile_headers导致重新定义错误

Cmake target_precompile_headers导致重新定义错误
EN

Stack Overflow用户
提问于 2020-09-23 22:36:11
回答 1查看 311关注 0票数 4

在使用Cmake target_precompile_headers时,我们会遇到很多重新定义错误,比如

代码语言:javascript
复制
/usr/include/c++/8/bits/stringfwd.h:70:37: error: redefinition of default argument for ‘class _Traits’
/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h:21:3: error: conflicting declaration ‘typedef struct __mbstate_t __mbstate_t’
/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h:28:8: error: redefinition of ‘struct __locale_struct’
/usr/include/c++/8/bits/postypes.h:112:7: error: redefinition of ‘class std::fpos<_StateT>’
/usr/include/c++/8/bits/postypes.h:216:1: error: redefinition of ‘template<class _StateT> bool std::operator==(const std::fpos<_StateT>&, const std::fpos<_StateT>&)’
/usr/include/c++/8/bits/postypes.h:221:1: error: redefinition of ‘template<class _StateT> bool std::operator!=(const std::fpos<_StateT>&, const std::fpos<_StateT>&)’
/usr/include/c++/8/iosfwd:76:70: error: redefinition of default argument for ‘class _Traits’
/usr/include/c++/8/iosfwd:79:70: error: redefinition of default argument for ‘class _Traits’
/usr/include/c++/8/iosfwd:82:70: error: redefinition of default argument for ‘class _Traits’

还有不计其数的其他函数,都来自于std库函数。

我们的Cmake设置是尽可能基本的,我们使用g++-8。

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.1)
set (CMAKE_CXX_STANDARD 14)
project(VoxelGrid LANGUAGES CXX)
file(GLOB srcfiles 
${PROJECT_SOURCE_DIR}/src/*.h   
${PROJECT_SOURCE_DIR}/src/*.cpp
)
add_executable(VoxelGridTest exe/main.cpp ${srcfiles})
target_include_directories(VoxelGridTest PUBLIC ${PROJECT_SOURCE_DIR}/src)
target_precompile_headers(VoxelGridTest PUBLIC ${PROJECT_SOURCE_DIR}/pchs/pch.h)

我们有一个src和一个pch文件夹。系统是Ubuntu 20。看起来这个问题应该很常见,但到目前为止我们什么也没发现。预编译头仅为

代码语言:javascript
复制
#pragma once
#include <iostream>

别无他法。

谢谢你的建议!

EN

回答 1

Stack Overflow用户

发布于 2021-06-24 01:03:19

事实证明,这是一个bug in GCC。我最终将pch.h的内容包装在include guards中:

代码语言:javascript
复制
// Not using #pragma once here
// see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56549
#ifndef My_PCH_GUARD
#define My_PCH_GUARD

#include <iostream>

#endif

另一种解决方案是从源代码中删除BOM。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64030325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档