我正在运行 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
我对此进行了一段时间的搜索,但我不断得到的答案无法回答这个特定的场景。
我有一堂课叫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) 我正在 Windows 操作系统上使用 Eclipse 构建一个 C++ 项目,我也在使用 Eigen 线性代数库。我的问题是 Eigen 的编译时间很慢(大约 50 秒)。
我已经尝试过这些建议的解决方案:
#define EIGEN_NO_DEBUG:它减少了额外的 3 秒时间我真的需要一个解决方案,每次我构建项目来测试一些东西时都等待 47 秒是非常不切实际的。
任何想法都非常感谢,谢谢。
我有一个包含许多目标的 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) 要禁用所有文件中的警告,我正在使用以下预编译器标头:
#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/. 我怎样才能做到这一点?
我有两个关于 C++ 预编译头功能的问题。
1.当您创建 .gch 文件(使用 GCC)时实际上发生了什么,它包含什么?
2.为什么这些文件的大小如此之大,但最终的可执行文件却如此之小。
我有一个非常大的项目,为了提高编译速度,我开始测试预编译的头文件。
我现在已经设置了一切:
StdAfx.h仅创建它)StdAfx.hStdAfx.h通过 VS 的强制包含自动包含在我的所有文件中现在出现的问题如下:
我是否需要删除已添加到文件中的所有项目文件的所有包含内容,StdAfx.h还是没有必要?编译器会自动跳过任何包含,因为他知道它是/文件的一部分StdAfx.h还是我应该手动从每个.h/.cpp文件中删除它们?
我试过使用带有 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,但仍然需要更长的时间。知道是什么原因造成的吗?
我尝试使用共享的 .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