标签: precompiled-headers

这个编译器警告是什么意思?“在不同的地址有文本段”

我正在运行 Lion 的 Mac 上交叉编译一个项目,使用 GCC 作为 ARM 目标。我正在使用预编译标头,并且针对针对我的 PCH 进行编译的每个对象都会收到此警告:

cc1plus:警告:/yada/yada/yada_afx.hpp.gch:在不同地址有文本段[默认启用]

它似乎并没有阻止程序运行,但我担心它可能会导致或导致性能问题。该警告是什么意思?我应该担心吗?

顺便说一句,这是 cmake 编译所使用的命令的示例(删除了一些长路径):

/opt/local/bin/arm-linux-uclibc-g++ -DBOOST_PARAMETER_MAX_ARITY=16 \
-DBOOST_MPL_LIMIT_STRING_SIZE=80 -Wno-multichar -g -I/lots/of/include/dirs \
-include yada_afx.hpp -Winvalid-pch -o MySource.cpp.o -c MySource.cpp
Run Code Online (Sandbox Code Playgroud)

cross-compiling precompiled-headers compiler-warnings gcc-warning

5
推荐指数
0
解决办法
1347
查看次数

在预编译头文件中包含头文件并在我的类头文件中包含头文件

我对此进行了一段时间的搜索,但我不断得到的答案无法回答这个特定的场景。

我有一堂课叫VisibleGameObject. 我想知道如果我将正常的包含放在标头中(以便其他开发人员可以使用相同的类),并将相同的包含放在我的预编译标头中,会发生什么stdafx.h 我不希望开发人员依赖于我的 pch。

// VisibleGameObject.h

#pragma once
#include "SFML\Graphics.hpp"
#include <string>

class VisibleGameObject
{
public:
    VisibleGameObject();
    virtual ~VisibleGameObject();

    virtual void Load( std::string filename );
    virtual void Draw( sf::RenderWindow & window );

    virtual void SetPosition( float x, float y );

private:
    sf::Sprite  _sprite;
    sf::Image _image;
    std::string _filename;
    bool _isLoaded;
};
Run Code Online (Sandbox Code Playgroud)

实施:

// VisibleGameObject.cpp
#include "stdafx.h"
#include "VisibleGameObject.h"

...
Run Code Online (Sandbox Code Playgroud)

个人计算机信息中心:

// stdafx.h
#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>


// TODO: reference additional headers your program …
Run Code Online (Sandbox Code Playgroud)

c++ include precompiled-headers

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

预编译特征头

我正在 Windows 操作系统上使用 Eclipse 构建一个 C++ 项目,我也在使用 Eigen 线性代数库。我的问题是 Eigen 的编译时间很慢(大约 50 秒)。

我已经尝试过这些建议的解决方案:

我真的需要一个解决方案,每次我构建项目来测试一些东西时都等待 47 秒是非常不切实际的。

任何想法都非常感谢,谢谢。

c++ eclipse compilation precompiled-headers

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

如何从 gcc 的预编译头中获得最大收益?

我有一个包含许多目标的 C++ 项目,其中包括大量 boost 头文件和其他行密集型头文件。大多数目标都包含相同的标头。因此,我认为这可能是使用预编译头(pch)的理想选择。因此,我创建了一个包含最多包含头文件的头文件并对其进行了预编译。

这将编译单元的代码行从 350k 减少到 120k(我将标志传递-save-temps给 gcc 来检查)。我检查了一下,是-H和参数一起使用的,pch前面有一个感叹号。预编译头有550MB。

不过,编译时间仅从 23 秒减少到 20 秒。

预编译头能带来这么小的改进吗?如果不是,我做错了什么?预编译头的编译时间最短的是什么?

编辑:这是 gcc 命令:

/usr/bin/c++
-fPIC -I/projectDir/build/source -I/projectDir/source -I/usr/include/eigen3 -include /projectDir/build/source/Core/core/cotire/Core_ORIGINAL_CXX_prefix.hxx -Winvalid -pch -g -Wall -Wextra -Wno-long-long -Wno-unused-parameter -std=c++0x -DBOOST_ENABLE_ASSERT_HANDLER -D_REENTRANT -o CMakeFiles/SubProject.dir/cotire/SubProject_ORIGINAL_CXX_unity.cxx.o -c /projectDir /build/source/ArmarXCore/statechart/cotire/SubProject_ORIGINAL_CXX_unity.cxx

通过的输出-ftime-report给了我(启用 PCH):

Execution times (seconds)
 phase setup             :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall    1321 kB ( 0%) ggc
 phase parsing           :   7.29 (32%) usr   1.69 …
Run Code Online (Sandbox Code Playgroud)

c++ gcc precompiled-headers

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

如何禁用特定位置的警告?

要禁用所有文件中的警告,我正在使用以下预编译器标头:

#ifndef PrefixHeader_pch
#define PrefixHeader_pch

#ifdef __OBJC__
#import <Foundation/Foundation.h>

#endif

#pragma clang diagnostic ignored "-Wmacro-redefined"
#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
#pragma clang diagnostic ignored "-Wshorten-64-to-32"
#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
#pragma clang diagnostic ignored "-Wprotocol"
#pragma clang diagnostic ignored "-Wmissing-selector-name"

#endif /* PrefixHeader_pch */
Run Code Online (Sandbox Code Playgroud)

我需要禁用位于特定文件夹中的文件的警告,例如$(SRCROOT)/wrapper/. 我怎样才能做到这一点?

xcode warnings clang precompiled-headers

5
推荐指数
0
解决办法
299
查看次数

C++ 预编译头文件大小巨大

我有两个关于 C++ 预编译头功能的问题。

1.当您创建 .gch 文件(使用 GCC)时实际上发生了什么,它包含什么?

2.为什么这些文件的大小如此之大,但最终的可执行文件却如此之小。

c++ precompiled-headers

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

预编译头文件 - 从所有其他文件中删除所有预编译头文件所必需的

我有一个非常大的项目,为了提高编译速度,我开始测试预编译的头文件。

我现在已经设置了一切:

  • 在 VS 中启用预编译头文件(将它们用于项目,StdAfx.h仅创建它)
  • 使用多处理器编译,除了 StdAfx.h
  • StdAfx.h通过 VS 的强制包含自动包含在我的所有文件中

现在出现的问题如下:

我是否需要删除已添加到文件中的所有项目文件的所有包含内容,StdAfx.h还是没有必要?编译器会自动跳过任何包含,因为他知道它是/文件的一部分StdAfx.h还是我应该手动从每个.h/.cpp文件中删除它们?

c++ precompiled-headers visual-studio

5
推荐指数
0
解决办法
342
查看次数

为什么在 GCC 上使用预编译头会更慢

我试过使用带有 GCC 的预编译头文件来加速我的构建之一。这是一个包含大约 80 个文件的项目,其中大部分包含一个我预编译的头文件。这个头包括大量的其他头。至少在纸面上,这似乎是使用 PCH 的一个很好的用例。

使用 clang 时,我得到了预期的加速,大约快了 2 倍。然而,在 gcc 上,编译需要更长的时间

我将我的 PCH 存储在一个单独的目录中,并尝试使用 来添加目录-I,以及直接指定 PCH -include(这不起作用:gcc 最终包括 PCH 和普通标头)。PCH 使用与源文件相同的选项进行编译。

没有 PCH 编译需要大约 13 秒。使用 PCH 大约需要 18 秒。我验证与-H-Winvalid-pch该GCC(仅)包括预编译的头。-H单个文件的完整输出如下所示:

! .bake_cache/x64-Linux-debug/include/corto.h.gch
 ./src/lang/boolean.c
Run Code Online (Sandbox Code Playgroud)

!应表明,GCC成功加载PCH:

-H 打印使用的每个头文件的名称,以及其他正常活动。每个名称都缩进以显示它在“#include”堆栈中的深度。预编译的头文件也会被打印出来,即使它们被发现是无效的;一个无效的预编译头文件用 '...x' 打印,一个有效的用 '...!' 打印 .

来自:https : //gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

我不知所措。gcc 似乎能够定位和使用 PCH,但仍然需要更长的时间。知道是什么原因造成的吗?

gcc build clang precompiled-headers

5
推荐指数
0
解决办法
607
查看次数

VisualStudio 跨平台 (Linux) 项目中的预编译头文件

常规VisualStudio 项目中,您可以通过转到Configuration Properties -> C/C++ -> Precompiled Headers来设置预编译头。在此输入图像描述

但是,在处理跨平台(Linux) 项目时,缺少预编译头选项。

在此输入图像描述

有没有办法配置预编译头?

c++ linux cross-platform precompiled-headers visual-studio

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

Visual Studio 删除共享 .pch 文件以及有关自定义生成步骤的问题

我尝试使用共享的 .pch 文件,该文件在一个项目中编译并在其他项目中使用。

但是,如果 PCH 项目的 .pdb 文件名与其他项目的 .pdb 文件名不同,则 .pch 文件将被删除。

此页面没有回答问题:https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/

我不想对所有 PDB 使用相同的名称。

问题:

1)为什么.pch文件在其他项目编译开始时被删除,这会导致C1083错误(.pch未找到),如果PDB名称不相等,不像该页面那样?

2)我使用 COPY 命令复制 pch.pdb 和 pch.idb 文件,是否有 RENAME 命令或其他命令,如果复制的 pch.pdb 应该像依赖项目的 PDB 一样命名?在哪里可以找到自定义构建步骤命令的完整列表?

3)我不明白自定义构建步骤中“附加依赖项”和“输出”的目的。我可以将 .pch 文件名输入到依赖项列表中,这样它就不会被删除吗?输出列表是否需要包含依赖项目的 PDB 名称或 pch.pdb,或两者都包含?

c++ msbuild custom-build-step precompiled-headers visual-studio

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