gpt4 book ai didi

c++ - 编译器如何从头文件知道某个地方存在源文件?

转载 作者:太空狗 更新时间:2023-10-29 19:57:30 25 4
gpt4 key购买 nike

我刚刚开始学习C/C++,但我有些困惑。我经常看到带有头文件参数的#include预处理程序指令:

#include <stdio.h>
#include <iostream.h>
#include "windows.h"
#include <math.h>

但是有时候 .h丢失了:
#include <iostream>

我已经知道,头文件仅包含函数的签名以及一些预处理器命令。但是,如果我包括 math.h,则编译器何时以及如何包括数学函数?

如果我创建一个库,那么将.c/.cpp/.h文件放在哪里,以及如何包含它们?

最佳答案

当您安装编译器时,标准头文件和库文件也将安装到众所周知的位置。例如,在Linux或Unix系统上,标准 header 通常安装在/usr/include/usr/local/include下,而标准库通常安装在/usr/lib/usr/local/lib下。

当您对头文件进行#include编译时,编译器将在不同位置查找该文件,具体取决于您使用尖括号(#include <stdio.h>)还是引号(#include "myfile.h")。例如,如果在尖括号中包含头文件,则gcc将在以下目录中搜索该头文件:

/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include

如果包含带引号的头文件,则 gcc将首先搜索当前工作目录,然后搜索命令行选项指定的其他目录,最后搜索标准包含上述路径的目录。

大多数编译器允许您指定其他包含路径作为编译命令的参数,例如
gcc -o executable-name -I /additional/include/path source-files

But sometimes the .h is missing:

#include <iostream>



这是C++约定1; C++标准 header 没有 .h扩展名,我想使它看起来比实际的面向对象更多(也就是说,您可以假装直接导入该类,而不是包含描述该类的文件的文本)。类(class))。

I already know, that the header file contains the signatures of the functions only, and some preprocessor commands. But when and how does the compiler include the math functions, if I include math.h?



数学函数的实现通常保存在一个单独的库中(已经编译并存档到单个二进制文件中的代码);根据编译器的不同,数学库可能会也可能不会自动链接到可执行文件中。例如,即使您包括 gcc头文件, math.h也不会自动链接任何数学库函数。您必须在构建命令中明确包含数学库:
gcc -o executable-name command-line-options source-files -lm

对于 gcc,约定是 -lname在名为 libname.a 2的库中链接。标准数学库文件名为 libm.a,因此 -lm告诉 gcc链接到 libm.a内包含的机器代码中。

像标准 header 一样,编译器将在众所周知的位置搜索标准库。您可以为不属于标准安装的库指定其他搜索路径,如下所示:
gcc -o executable-name command-line-options source-files -L /additional/library/path -ladditional-library

If I create a library, then where to put the .c/.cpp/.h files, and how to include them?



您可以将文件放置在几乎任何位置。您将在build命令中指定它们的位置。因此,假设您要创建一个名为 mylib的新库。您在主目录下创建一个新目录:
mkdir ~/mylib
cd ~/mylib

然后创建并编辑源文件和头文件:
cd ~/mylib
vi mylib.h
vi mylib.c

要将 mylib构建为静态库,请执行以下操作:
cd ~/mylib
gcc -c mylib.c
ar libmylib.a mylib.o

因此,完成后,目录 ~/mylib包含以下内容:
libmylib.a
mylib.c
mylib.h
mylib.o

要在程序中使用 mylib中收集的功能,您需要在编译命令中指定 header 和库包含路径:
gcc -o executable-name command-line-options source-files -I ~/mylib -L ~/mylib -lmylib

因此,如果在另一个程序中使用 include "mylib.h",它将告诉编译器在 ~/mylib中搜索该 header ,并且将告诉链接器 libmylib.a库将在 ~/mylib下找到。

在实际情况下,您将使用makefile处理所有构建,而不是手动构建所有内容。您可能还进行了设置,以便在构建过程中,将其他任何人需要使用您的库的所有 header 都复制到一个单独的 include子目录中,并将该库写入一个单独的 lib子目录中,因此您可以在不公开源代码的情况下分发库。在这种情况下,上面的build命令将更像:
gcc -o executable-name command-line-options source-files -I ~/mylib/include -L ~/mylib/lib -lmylib

1.情况并非总是如此; C++的最早实现使用 iostream.hvector.h等。我不确定该约定何时准确更改,但是已经有一段时间了。
2.实际上,我不确定这是 gcc约定还是 *nix约定;两者的结合处已久,有时很难记住。

关于c++ - 编译器如何从头文件知道某个地方存在源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33780405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com