如何在 c++ 中正确指定 #include 路径以使程序可移植

How properly specify the #include paths in c++ to make your program portable

本文关键字:路径 #include 可移植 程序 c++      更新时间:2023-10-16

我已经为此来回挣扎了一段时间,现在查找东西并提出问题,但我仍然处于十字路口。到目前为止,我所做的以及我目前所处的位置基于我被告知的情况是:我已经在我的存储库中添加了 2 个目录:src用于我的 .cpp 文件,并包含我的 .hpp 文件。在我的包含目录中,我将所有 .hpp 文件直接放在文件夹中,而在我的src目录中,我有几个子目录根据它们服务的目的对我的.cpp文件进行分组,例如srcValuationFunctionsMonteCarloFunctionsFunctionHelpers.

我已将所有#include "header.h"的名称更改为#include "..includeheader.h".这适用于直接位于src文件夹中的主文件,但现在我发现它不适用于我在子目录中的.cpp文件,就像我上面的例子一样,似乎我必须导航回根文件夹做一些类似#include "../../..includeheader.h"的事情,这显然不是要走的路。

我如何做到这一点,我在这里甚至走在正确的轨道上吗?我已经将我的存储库上传到 github(https://github.com/OscarUngsgard/Cpp-Monte-Carlo-Value-at-Risk-Engine(,目标是让某人能够去那里,查看程序的结构,克隆存储库并运行它(我想这就是目标始终是什么?还是某些责任通常落在存储库的克隆人身上以使其工作?

我正在使用Windows和Visual Studios,非常感谢帮助。

如何在 c++ 中正确指定 #include 路径以使程序可移植

请阅读 C++11 标准 n3337 并查看此C++参考网站。包含的标头甚至可能不是计算机上的任何文件(原则上它可能是某个数据库(。

如果您使用一些最近的 GCC 作为C++编译器,它确实具有预编译标头和链接时间优化工具。另请阅读其预处理器的文档。我建议启用所有警告和调试信息,因此请使用g++ -Wall -Wextra -g.

如果您使用 Microsoft VisualStudio 作为编译器,它有一个文档并提供一个cl命令,其中包含各种优化工具。请务必启用警告。

您可以考虑使用一些C++静态分析器,例如 Clang's 或 Frama-C++。这份报告草案可能是相关的,你应该感兴趣(至少作为参考(。

源代码编辑器(VisualStudioCode或GNU emacs或vim或许多其他编辑器(和调试器(例如GDB(和版本控制系统(例如git(也有文档。请花时间阅读它们,并阅读如何调试小程序

请记住,C++代码可以通过ANTLR或SWIG等工具生成。

建议以双重方式处理您的问题:确保将正确的包含路径传递给编译命令(来自构建自动化工具,如 GNU make 或 ninja 或 meson(。这就是 GNU autoconf 所做的。

您可以考虑在软件项目中使用autoconf

我已将所有 #include"header.h"的名称更改为 #include"..\include\header.h"。

我相信这是一个错误,你当然想使用斜杠,例如#include "../include/header.h"您是否关心以后将代码移植到其他操作系统(例如Linux,Android,MacOSX或其他一些Unix(。在大多数操作系统上,目录的分隔符是/,大多数C++编译器都接受它。

研究Qt或POCO的源代码可能是鼓舞人心的,这些开源库中的一个或两个可能对你有用。它们是跨平台的。GCC和Clang的源代码也可能很有趣。两者都是开源C++编译器,主要用C++编写(使用一些元编程方法,即一些C++代码生成的(。

另请参阅此和那个。

在程序开发中,通常需要使用其他人开发的工具包。一般来说,在Visual Studio中,源文件很少使用,大多数使用声明类的头文件和链接库。如果要使用这些类,则需要在文件中包含头文件的名称,例如 #include"cv.h"。但这还不够,因为这个文件一般不在当前目录下,解决方法如下:

依次打开"项目-属性-配置属性-C/C++-常规-附加包含目录"并添加所有路径。

对于所有类型的 IDE,我们可以执行类似的操作来包含目录。因此,对于那些克隆项目的人来说,修改项目中包含的目录是很正常的。