很久以前我曾经使用过预编译的头文件:a.加快编译速度和b.因为我支持多种开发工具,如CodeWarrior,MPW,VS,ProjectBuilder,gcc,intel编译器等等.
现在我有一台带有32GB RAM的Mac Pro.
现在我只使用CMake.
那么我们真的需要预先编译的头文件吗?
我有没有看到/知道明显的好处?
如何制作跨平台的预编译头?也许这会简化我的生活.
我有一个 Visual Studio C++ 项目,最近将 Visual Studio 2022 从版本 17.5 更新到版本 17.6 后,编译从一开始就停止并出现错误:
1>------ Rebuild All started: Project: MRPch, Configuration: Debug x64 ------
1>Scanning sources for module dependencies...
1>std.compat.ixx
1>std.ixx
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\modules\std.compat.ixx : fatal error C1083: Cannot open include file: 'MRPch.h': No such file or directory
1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\modules\std.ixx : fatal error C1083: Cannot open include file: 'MRPch.h': No such file or directory
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(486,5): warning MSB8074: Cannot read Module Dependencies file C:\Work\MeshInspector\source\TempOutput\MRPch\x64\Debug\std.ixx.module.json: Expecting element …Run Code Online (Sandbox Code Playgroud) compiler-errors precompiled-headers visual-c++ visual-studio-2022
像往常一样,当我的大脑弄乱我无法弄明白的东西时,我来找你们帮忙:)
这次我一直想知道为什么stdafx.h的运行方式如何?根据我的理解,它做了两件事:
现在,这两件事对我来说似乎是两个非常不同的任务,我想知道为什么他们没有采取两个单独的步骤来照顾它们?对我来说,有一个#pragma-command做书签的东西,并且可选地有一个标题文件,使用一长串的windows.h来做包括经常使用的标题......这样的事情似乎是合理的.这将我带到了我的下一个point:为什么我们被迫通过stdafx.h包含经常使用的头文件?就个人而言,我不知道我使用的任何常用标题我还没有自己的包含 - 但也许这些标题是.dll生成所必需的?
Thx提前
PrecompiledHeader.h:
#include "stdio.h"
Run Code Online (Sandbox Code Playgroud)
main.cpp中:
#include "PrecompiledHeader.h"
#include "stdio.h"
int main()
{
return 123;
}
Run Code Online (Sandbox Code Playgroud)
创建预编译头:
clang -x c++-header PrecompiledHeader.h -o PrecompiledHeader.pch
Run Code Online (Sandbox Code Playgroud)
在main.cpp上运行clang预处理器:
clang main.cpp -include-pch PrecompiledHeader.pch -E
Run Code Online (Sandbox Code Playgroud)
这当前输出许多页输出(stdio.h).但是,我想得到的只是main函数,并且从输出中省略了PrecompiledHeader.h的内容.
有没有办法让clang这样做?(如果有人知道visualstudio的cl.exe同样问题的答案,我也很想知道:)
我有一堆遗留代码,我需要编写单元测试.它在任何地方使用预编译的头文件,因此几乎所有.cpp文件都依赖于stdafx.h,这使得为了编写测试而难以破坏依赖性.
我的第一直觉是删除所有这些stdafx.h文件,这些文件大部分都包含#include指令,并根据需要将这些#includes直接放在源文件中.
这将使得必须关闭预编译的头文件,因为它们依赖于像stdafx.h这样的文件来确定预编译头文件的停止位置.
有没有办法保留没有stdafx.h依赖项的预编译头文件?有没有更好的方法来解决这个问题?
我正在尝试升级旧解决方案以使用VS2010(VC100).
我有它的设置,以便stdafx.cpp将从stdafx.h创建一个预编译的头stdafx.pch.然后指示包含stdafx.h的所有其他.cpp文件使用预编译头.
这些帖子帮助我做到了这一点:
现在,当我在发布模式下构建时,一切都很好.但是,当我尝试在调试模式下构建时,我得到了一大堆错误:
错误1错误C2859:[已删除]\debug\vc100.idb不是创建此预编译头时使用的idb文件,请重新创建预编译头.
我相信这个.idb文件是Visual Studio创建的中间调试文件.
为什么我收到此错误?换句话说,为什么它在创建预编译头时不使用此.idb文件?
我不确定您需要什么进一步的信息才能给我回答,所以请问我是否需要提供更多信息.
是否可以在使用automake/libtool的项目中使用gcc预编译头文件?
添加新的make规则来构建预编译头文件并不困难.问题是你还必须添加由libtool和AFAIK引入的编译标志,它无法处理标头输入文件.
你怎么能这样做?
当此解决方案使用.lib文件而不是.dll文件时,这没有错误.
我有我的所有项目,除了一个当前使用预编译头,没有错误.预编译的头文件名为" LudoGlobal.h ".我试图将最后一个项目链接到这个预编译的头文件(它存在于一个单独的"Core"项目中),但是我收到以下错误:
错误4致命错误C1083:无法打开预编译的头文件:'....\Output\LudoSound\Debug\LudoSound.pch':没有这样的文件或目录ludosoundmanager.cpp 1
对于每个.cpp文件.为什么是这样?我该如何解决?
我意识到LudoSound.pch不存在.我假设它可能是在LudoSound编译时创建的,是吗?
我创建了一个头文件。一些简单的如下。
#pragma once
#include <iostream>
template<typename T>
void say(T t) {
std::cout << t << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
然后用于g++创建gch带有g++ hello.h. 它给了我这个警告->
pch.h:2:9: warning: #pragma once in main file
2 | #pragma once
| ^~~~
Run Code Online (Sandbox Code Playgroud)
但是gch创建的文件和预编译的头文件工作正常。如果我使用标题守卫,这个错误就会消失。
我在这里做错了吗?
c++ ×7
visual-c++ ×3
stdafx.h ×2
autoconf ×1
automake ×1
autotools ×1
clang ×1
debugging ×1
dependencies ×1
dll ×1
g++ ×1
libtool ×1
pragma ×1
unit-testing ×1