标签: precompiled-headers

Cmake target_precompile_headers 导致重新定义错误

当使用 Cmakes 时,target_precompile_headers我们会遇到很多重定义错误,例如

\n
/usr/include/c++/8/bits/stringfwd.h:70:37: error: redefinition of default argument for \xe2\x80\x98class _Traits\xe2\x80\x99\n/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h:21:3: error: conflicting declaration \xe2\x80\x98typedef struct __mbstate_t __mbstate_t\xe2\x80\x99\n/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h:28:8: error: redefinition of \xe2\x80\x98struct __locale_struct\xe2\x80\x99\n/usr/include/c++/8/bits/postypes.h:112:7: error: redefinition of \xe2\x80\x98class std::fpos<_StateT>\xe2\x80\x99\n/usr/include/c++/8/bits/postypes.h:216:1: error: redefinition of \xe2\x80\x98template<class _StateT> bool std::operator==(const std::fpos<_StateT>&, const std::fpos<_StateT>&)\xe2\x80\x99\n/usr/include/c++/8/bits/postypes.h:221:1: error: redefinition of \xe2\x80\x98template<class _StateT> bool std::operator!=(const std::fpos<_StateT>&, const std::fpos<_StateT>&)\xe2\x80\x99\n/usr/include/c++/8/iosfwd:76:70: error: redefinition of default argument for \xe2\x80\x98class _Traits\xe2\x80\x99\n/usr/include/c++/8/iosfwd:79:70: error: redefinition of default argument for \xe2\x80\x98class _Traits\xe2\x80\x99\n/usr/include/c++/8/iosfwd:82:70: error: redefinition of default argument for \xe2\x80\x98class _Traits\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n

以及无数其他的,全部来自 std 库函数。 …

c++ cmake precompiled-headers

5
推荐指数
1
解决办法
1116
查看次数

VS2008 win32项目默认值 - 删除默认的预编译头文件

我已经通过各种方法试图找到一种方法让IDE让我创建一个没有预编译头文件的新win32pject.我已经阅读了这个论坛上的每个主题,其中包含"precpmpiled headers"字样,我得到的最接近的是:

预编译标题

使用2008专业版(不表达,虽然行为似乎相似)我去:

文件 - >新建 - >项目

这将打开New Project对话框,在其中我选择Visual C++ Win32 Project,输入名称并单击OK.

然后我得到了"Win32应用程序向导".将"应用程序类型"设置为"Windows应用程序"后,应用程序设置窗格将不允许我取消选中预编译的标头.复选框显示为灰色.如果我选择"控制台应用程序",我可以取消选中它,但我正在创建一个GUI应用程序.

当我单击完成时,我在xxx.cpp中获得了6码的代码,四个头文件和强制性的stdafx.cpp.

也许我可以删除和删除所有这些东西,然后进入属性并关闭PCH,但这对于我想写的许多小项目示例来说都是一个麻烦.

我只想要一个将编译为win32应用程序的空项目,那么如何将PCH默认值更改为NONE?

c++ precompiled-headers visual-studio-2008

4
推荐指数
1
解决办法
3924
查看次数

预编译头设计问题

我有使用预编译头的代码.(之前由其他人完成)

在其中,它们包括几个.h文件.

如果我有使用普通.h文件的类,这些文件当前不在现有的预编译头文件中,那么将它们扔在那里有什么好处呢?也许编译速度,但我认为它会清理类/标题有点过吗?

对预编译的标题有什么作用和不做什么?

c++ precompiled-headers

4
推荐指数
2
解决办法
293
查看次数

gcc预编译头文件使用-c选项时的奇怪行为

短篇故事:

我无法使用gcc -c选项使预编译的头文件正常工作.

很长的故事:

伙计们,我在Linux上使用gcc-4.4.1,在一个非常大的项目中尝试预编译头之前,我决定在简单程序上测试它们.他们"有点工作",但我对结果不满意,我确信我的设置有问题.

首先,我编写了一个简单的程序(main.cpp)来测试它们是否可以工作:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/type_traits.hpp>

int main()
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了预编译头文件pre.h(在同一目录中),如下所示:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/type_traits.hpp>
Run Code Online (Sandbox Code Playgroud)

...并编译它:

$ g++ -I. pre.h
Run Code Online (Sandbox Code Playgroud)

(pre.h.gch创建)

之后,我使用和不使用预编译头来测量编译时间:

与pch

$ time g++ -I. -include pre.h main.cpp

real    0m0.128s
user    0m0.088s
sys  0m0.048s
Run Code Online (Sandbox Code Playgroud)

没有pch

$ time g++ -I. main.cpp 

real    0m0.838s
user    0m0.784s
sys  0m0.056s
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好!快了近7倍,令人印象深刻!现在让我们尝试一些更现实的东西.我的所有资源都是使用-c选项构建的,出于某种原因我无法使用pch.您可以通过以下步骤重现这一点......

我创建了测试模块foo.cpp,如下所示:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/type_traits.hpp>

int whatever()
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下是我尝试使用和不使用pch构建模块foo.cpp的时间:

与pch

$ time g++ -I. …
Run Code Online (Sandbox Code Playgroud)

c++ gcc precompiled-headers

4
推荐指数
1
解决办法
1365
查看次数

#define以及如何使用它们 - C++

在我预先编译的标题中:

#define DS_BUILD
#define PGE_BUILD
#define DEMO
Run Code Online (Sandbox Code Playgroud)

然后在源头我做:

#if (DS_BUILD && DEMO)
    ---- code---
#elif (PGE_BUILD && DEMO)
    --- code---
#else
    --- code ---
#endif
Run Code Online (Sandbox Code Playgroud)

我是否收到错误消息:

错误:运算符'&&'没有正确的操作数

我以前从未见过这个.我在OS X 10.6.3上使用XCode 3.2,GCC 4.2

c++ precompiled-headers c-preprocessor

4
推荐指数
1
解决办法
1863
查看次数

存档构建中的Xcode 4 gcc失败:跳过预编译步骤?

我已经能够成功存档于Xcode 4,但突然间(??),我不能.构建失败并带有无效的.pch文件.错误被粘贴在下面(从重新尝试获得-Winvalid-pch,但是从构建日志中发现的事实是预编译的头文件实际上没有被预编译 - 它是一个iOS应用程序,直接从CopyPNG步骤到.我编译.

我可以偶然翻看一下吗?在我的.pbxproj文件的差异中,似乎没什么奇怪的.

cc1obj: warning: /Users/myname/Library/Developer/Xcode/DerivedData/Foo-afikuaovoaeqhreaaaakpafseuuv/Build/PrecompiledHeaders/Foo_Prefix-guqixmujoiaaaacwjctfkrztxmbz/Foo_Prefix.pch.gch: created by a different GCC executable
cc1obj: error: /Users/myname/Library/Developer/Xcode/DerivedData/Foo-afikuaovoaeqhreaaaakpafseuuv/Build/PrecompiledHeaders/Foo_Prefix-guqixmujoiaaaacwjctfkrztxmbz/Foo_Prefix.pch: No such file or directory
cc1obj: error: one or more PCH files were found, but they were invalid
Run Code Online (Sandbox Code Playgroud)

对于所有配置,"预编译前缀标头"构建设置为"是".产品 - >清洁无济于事.删除派生数据下的缓存pch内容并不能解决问题.真的好像整个"预编译"步骤都缺失了.

另一个事实:启用设置"增加预编译标题的共享"让它成功.但我几乎找不到这个标志真正起作用的参考,我之前从未使用过它.也许是合理的,当发生这种情况时,预编译步骤仍然没有显示出来.

xcode gcc archive precompiled-headers

4
推荐指数
1
解决办法
1660
查看次数

Visual Studio强制在项目的所有编译单元中包含预编译的头文件?

当编译器编译源(例如*.cpp)文件时,它会创建目标文件(例如*.o),以便稍后它将链接到其他.o.so(.libWindows文件)文件,并构成可执行文件.

现在,对于每次创建一些.pch文件时都不编译头文件的类比情况,这样它就会被链接器链接起来.

现在,如果在Visula Studio项目的范围内定义了一个预编译的头,那么为什么Visual Studio会抱怨错误(例如**fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?**)头文件未包含在.cpp文件中.

总结一下,这是我的问题:

  1. 为什么在每个.cpp文件中都需要项目的预编译头?
  2. 每个编译单元中是否存在预编译头的优化如何优化编译过程?换句话说,这个要求的好处是什么?(可能由用户决定在哪里包括,哪里不包括!)
  3. 如果预编译头包含在.cpp文件中,该文件仅使用.pch文件中的2%,则剩余的98%将被添加到相应的.o文件中?

c++ compiler-construction linker precompiled-headers visual-studio-2008

4
推荐指数
1
解决办法
5149
查看次数

在Visual Studio 10项目中一起使用/ YC和/ MP

我试图绕过/ YC和/ MP的限制互相排斥.我想利用预编译头和多进程编译.

到目前为止我的答案是创建2个项目而不是1.第一个是pch生成库,它只包含stdafx.h和stdafx.cpp.它使用stdafx.cpp上设置的/ YC生成pch文件

该库成功生成pch文件!作为旁注,pch库项目还指定了/ YU指向其stdafx.h和/ Fp引用输出pch文件.

我的第二个项目是我的主要可执 它具有/ MP指定但没有为任何文件指定/ YC,并且不包含stdafx.h或stdafx.cpp.相反,我将项目的/ YU设置为pch库的stdafx.h,将/ Fp设置为pch库生成的pch.然后我将pch库设置为exe项目的依赖项.我还在exe项目上设置了/ FI,强制从每个编译单元的pch库中包含stdafx.h.

我的问题是,虽然pch库生成了pch文件,并且exe项目似乎确实正确地引用了生成的pch文件,但是一旦exe项目开始构建(在与pch无关的一些预构建步骤之后),它删除了pch库生成的pch.我想这是因为它认为,如果指定了/ Fp,即使没有指定/ YC,项目也会生成该文件.

我有什么问题吗?我错过了一步.有没有办法阻止exe项目在开始构建之前删除我的pch文件?

任何帮助将不胜感激!

c++ winapi visual-studio-2010 precompiled-headers visual-studio

4
推荐指数
1
解决办法
1768
查看次数

PRECOMPILED HEADERS无法使用Qt Creator/qmake/MinGw进行调试构建

在Qt Creator中,我有一个使用PRECOMPILED HEADERS的专业文件.

当我在Release模式下构建时,构建工作非常完美.但是在Debug模式下构建会产生错误,导致生成目标文件失败.例:

17:12:40: Running steps for project Euclide...
17:12:40: Configuration unchanged, skipping qmake step.
17:12:40: Starting: "C:\Qt\Tools\mingw48_32\bin\mingw32-make.exe" 
C:\Qt\5.2.0\mingw48_32\bin\qmake.exe -spec win32-g++ CONFIG+=debug -o Makefile ..\euclide\Euclide.pro
C:/Qt/Tools/mingw48_32/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'C:/UserPrograms/Euclide/build'
g++ -c -include debug\_pch.h -pipe -fno-keep-inline-dllexport -std=gnu++11 -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_WEBKITWIDGETS_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_QUICK_LIB -DQT_POSITIONING_LIB -DQT_OPENGL_LIB -DQT_PRINTSUPPORT_LIB -DQT_WEBKIT_LIB -DQT_MULTIMEDIA_LIB -DQT_QML_LIB -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_SENSORS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I..\euclide -I"..\..\..\Program Files (x86)\boost\boost_1_53_0" -I"..\numlib\mathvec" -I"..\..\..\Qt\5.2.0\mingw48_32\include" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtWebKitWidgets" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtMultimediaWidgets" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtQuick" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtPositioning" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtOpenGL" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtPrintSupport" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtWebKit" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtMultimedia" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtQml" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtWidgets" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtNetwork" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtSensors" …
Run Code Online (Sandbox Code Playgroud)

c++ qt build-process qmake precompiled-headers

4
推荐指数
1
解决办法
2557
查看次数

意想不到的#else

由于某些原因我无法解释,编译器输出的错误表明它发现了一个意外的#else令牌.

这发生在文件的开头:

#if defined( _USING_MFC )
   #include "stdafx.h"
#else
   #include <windows.h>
#endif
Run Code Online (Sandbox Code Playgroud)

在此之前没有任何代码可以期待几个(单行)注释.

在.cpp文件中发生此错误.您在上面看到的是文件的开头.之前没有任何事情.

我尝试在上面定义的代码之前添加以下代码,错误现在是意外的#endif

#if 1
   #include "stdafx.h"
#endif
Run Code Online (Sandbox Code Playgroud)

所以我怀疑包含stdafx.h文件存在问题,该文件包含以下代码:

#ifndef STDAFX_H_INCLUDED
#define STDAFX_H_INCLUDED

#include <Afx.h>
#include <Windows.h>

using namespace ATL;

#endif // STDAFX_H_INCLUDED
Run Code Online (Sandbox Code Playgroud)

它没什么特别的.我还从stdafx.cpp文件中包含这个stdafx.h文件,该文件只包含#include语句,并且它正确编译.

以下是项目预处理器定义:

_DEBUG
_WIN32_WCE=$(CEVER)
UNDER_CE
WINCE
DEBUG
_WINDOWS
$(ARCHFAM)
$(_ARCHFAM_)
_UNICODE
UNICODE
_TERMINAL_FALCONX3_CE6
_NO_CPP_EXCEPTIONS
_DONT_INCLUDE_WS_HEADERS
_USING_MFC
Run Code Online (Sandbox Code Playgroud)

还有一些额外的信息:使用Visual Studio 2008编译Windows CE 6.

会导致什么?谢谢.

c++ precompiled-headers c-preprocessor

4
推荐指数
1
解决办法
528
查看次数