【问题标题】:How does C++ linker know what .cpp files to useC++ 链接器如何知道要使用哪些 .cpp 文件
【发布时间】:2016-10-17 21:32:43
【问题描述】:

我是一名 C++ 学习者,我遇到了将代码分成多个文件以加快大型项目的编译过程的概念。

但是这本书没有告诉我什么,我试图在其他书籍和网络上找到它,但没有运气的是链接器(在编译期间)如何知道要包含哪些文件。

当我创建新文件时,我用#include "newfile.h" 将它的头文件连接到主文件,但是在这个头文件中我没有写在哪里可以找到函数的定义。

所以我想象的过程是它从主文件开始,并在那里找到与其他文件的“连接”。问题是它如何找到那些据我所知不需要与其头文件命名相同的 .cpp 文件。

示例:

主文件:

#include <iostream>
#include "krneki_H.h"

using namespace std;


int main()
{
 krneki1();
 krneki2();
 krneki3();
}

以及头文件:

void krneki1();
void krneki2();
void krneki3();

还有新的 .cpp 文件:

#include <iostream>
#include "krneki_H.h"

using namespace std;

void krneki1() {
cout<<"Krneki1"<<endl;}

void krneki2() {
cout<<"Krneki2"<<endl;}

void krneki3() {
cout<<"Krneki3"<<endl;}

请注意,没有指示使用第二个 cpp 文件。它只知道使用它。它会搜索地图中的所有 .cpp 文件吗?

谢谢你的回答。

【问题讨论】:

  • 不要垃圾标签! C 是一种不同的语言!
  • 它什么都不知道。你告诉它哪些文件要链接在一起。
  • 链接器根本不使用源代码。程序员必须告诉链接器它需要哪些文件,但它们是编译后的二进制文件,而不是.cpp.h 文件..
  • 我自己也想过这个问题。据我了解,您指定目录中的所有 .cpp 文件都已编译(编译单元)。 #include 指令包括标题中的文件,就好像您在该行键入它们一样。最后,链接器链接函数调用并寻找main 作为第一条指令。

标签: c++ compilation linker


【解决方案1】:

编译两个.cpp 文件使用gcc -c 或类似的命令行,然后将生成的两个.o 文件传递​​给链接器。链接器不会神奇地发现您要编译另一个 .cpp 文件。

例如

gcc -c main.cpp -o main.o           # compile
gcc -c krneki_H.cpp -o krneki_H.o   # compile
gcc main.o krneki_H.o -o main       # link

您的 IDE 可能会自动处理这些细节,在这种情况下,它会编译您添加到项目中的所有 .cpp 文件,然后链接编译步骤生成的所有 .o 文件。

【讨论】:

    【解决方案2】:

    没有。它不仅知道使用它。在您的示例中,如果您使用 main.cpp 编译并且没有该新 cpp 文件,您将收到“未定义引用”错误。

    发生的情况是,您正在使用一个可以自动编译所有 cpp 文件的精美 IDE。它默认将它们全部包含在您的 makefile 中。

    我建议您尝试从头开始设计一个 makefile,并亲自看看如果您不包含具有您的函数实现的 cpp 文件,您将如何得到“未定义的引用”错误。

    【讨论】:

      猜你喜欢
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      相关资源
      最近更新 更多