设置一个项目,该项目可以使用和不使用预编译头进行编译
Setting up a project which would compile both with and without precompiled header
我要做的是建立一个项目,无论是否设置预编译头。stdafx.hpp
是我的P.H.
我的主要问题是我的文件在几个目录,而不仅仅是项目根目录。What have I try:
- 如果我<<li> p>
如果我将强制包含文件设置为
stdafx.hpp
,无论是相对路径还是绝对路径,编译器都会给我错误(现在不记得了,如果有必要我会重现它)
#include "stdafx.hpp"
任何地方都可以正常工作PH设置,但如果我停用它,它会抱怨,因为子目录中的文件找不到它。
如果我<<li> p>#include "../stdafx.hpp"
在subdirs下的文件中,没有PH可以正常工作,但是有了PH,编译器会抱怨stdafx.hpp
没有被包括在内。
那么,解决方案是什么呢?
规范的解决方案很简单:不包含预编译的头文件(默认情况下为stdafx.h)。如果你的代码需要使用预编译的头文件进行编译,请使用/FI (Name Forced Include File)编译开关:
该选项与在命令行、CL环境变量或命令文件中指定的每个源文件的第一行的#include指令中使用双引号指定文件的效果相同。
这允许您使用预编译的头文件,而无需修改源代码。
使用带有双引号的#include指令的规则概述在#include指令(C/c++):形式:引用预处理器按以下顺序搜索包含文件:
- 与包含#include语句的文件在同一目录下。
- 在当前打开的目录中包含文件,以打开的相反顺序。从父include文件的目录开始搜索,然后继续向上搜索所有祖父include文件的目录。
- 沿着每个/I编译器选项指定的路径。
- 沿着INCLUDE环境变量指定的路径。
使用/I(附加包含目录)编译器开关来包含用于生成预编译头文件的头文件的目录,然后简单地允许您写入
/FIstdafx.hpp
没有设置/项目拓扑的组合,将允许您简单地切换预编译头打开或关闭。/Y、/FI和/I编译器开关必须同时使用,否则将其完全移除。要将一组配置作为一个单元来更改,您可以使用属性页(详细信息请参见使用项目属性)。
一个简单的解决方案是设置项目的包含路径,以便一个普通的#include "stdafx.hpp"
总是找到头文件,而不管包含文件的目录。
如果您担心无意中使其他目录中的头文件可见,您甚至可以将可能预编译的头文件放在它自己的特殊目录中。
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 示例C++项目编译中的警告
- 使用 raylib 静态库进行项目编译
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- C++项目编译强制使用 /clr 选项,尽管在没有公共语言运行时支持的情况下执行它
- 我可以在将项目编译为静态库(未定义的引用)时在代码中使用 QImage 吗?
- 旧项目编译的未定义引用
- Codelite不使用全局编译设置或项目编译设置
- x264项目编译
- 使用 Boost 单元测试进行 G++ 项目编译
- 项目编译时无法使用 gvim
- 强制将特定文件编译为Objective-C/文件类型,但将整个项目编译为Objective C++
- Eclipse显示错误,但项目编译并执行
- 如何最好地将C++/Cython项目编译成可执行文件
- CMake项目编译精细的SHARED库,但不使用STATIC库
- 如何在实践中解决项目编译中链接库的顺序问题
- Cef项目编译链接error2001
- 我的项目编译在vs2008没有一个单一的问题,但不是在2010年
- visual studio 2010 - c++项目编译和链接