C++;链接器知道要使用什么.cpp文件 >我是C++学习者,我遇到了一个将代码分成多个文件的概念,以加快大型项目的编译过程。>P/>
然而,这本书没有告诉我的是,我曾试图在其他书籍和网络上找到它,但运气不佳的是链接器(在编译期间)如何知道要包含哪些文件 当我创建新文件时,我用C++;链接器知道要使用什么.cpp文件 >我是C++学习者,我遇到了一个将代码分成多个文件的概念,以加快大型项目的编译过程。>P/>,c++,compilation,linker,C++,Compilation,Linker,然而,这本书没有告诉我的是,我曾试图在其他书籍和网络上找到它,但运气不佳的是链接器(在编译期间)如何知道要包含哪些文件 当我创建新文件时,我用#include“newfile.h”将其头文件连接到主文件,但是在这个头文件中,我不写在哪里可以找到函数的定义 因此,我认为这个过程是从主文件开始的,在主文件中找到与其他文件的“连接”。问题是它如何找到那些在我看来不需要与头文件命名相同的.cpp文件 示例: void krneki1(); void krneki2(); void krneki3();
#include“newfile.h”
将其头文件连接到主文件,但是在这个头文件中,我不写在哪里可以找到函数的定义
因此,我认为这个过程是从主文件开始的,在主文件中找到与其他文件的“连接”。问题是它如何找到那些在我看来不需要与头文件命名相同的.cpp文件
示例:
void krneki1();
void krneki2();
void krneki3();
#include <iostream>
#include "krneki_H.h"
using namespace std;
void krneki1() {
cout<<"Krneki1"<<endl;}
void krneki2() {
cout<<"Krneki2"<<endl;}
void krneki3() {
cout<<"Krneki3"<<endl;}
主文件:
#include <iostream>
#include "krneki_H.h"
using namespace std;
int main()
{
krneki1();
krneki2();
krneki3();
}
和新的.cpp文件:
void krneki1();
void krneki2();
void krneki3();
#include <iostream>
#include "krneki_H.h"
using namespace std;
void krneki1() {
cout<<"Krneki1"<<endl;}
void krneki2() {
cout<<"Krneki2"<<endl;}
void krneki3() {
cout<<"Krneki3"<<endl;}
#包括
#包括“krneki_H.H”
使用名称空间std;
void krneki1(){
coutNo。它不仅仅知道如何使用它。在您的示例中,如果使用main.cpp
编译,并且没有新的cpp文件,您将得到一个“未定义引用”错误
发生的情况是,您正在使用一个奇特的IDE自动编译所有cpp文件。默认情况下,它将所有cpp文件都包含在您的makefile中
我建议您尝试从头开始设计一个makefile,并亲自看看如何获得“未定义引用”如果未包含包含函数实现的cpp文件,则会出错。您使用gcc-c
或类似命令行编译两个.cpp
文件,然后将生成的.o
文件传递给链接器。链接器不会神奇地发现您想要编译另一个.cppde>文件
比如说
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
文件。不要垃圾邮件标记!C是另一种语言!它什么都不知道。您可以告诉它链接哪些文件。链接器不使用源代码。程序员必须告诉链接器它需要哪些文件,但它们是编译过的二进制文件,而不是.cpp
或.h
文件。我自己也很想知道。据我所知,指定目录中的.cpp文件都是编译的(编译单元).include
指令包含标题中的文件,就好像您在该行中键入文件一样。最后,链接器链接函数调用并查找main
以将其作为第一条指令。