链接两个文件

Linking two files

我创建了两个基本的 .cpp 文件。第一个只有一行代码: int var=10; ,第二个是这样的:

#include <iostream>

using namespace std; 
           
int main(){

    cout<<var;
                  
    return 0; 

}             

我使用 gcc -o myprogram file1.cpp file2.cpp 编译我的代码并且我总是收到此消息:

error: ‘var’ was not declared in this scope
   13 |     cout<<var;

有人知道怎么解决吗?

如果“var”是一次性的,那么只需添加一个extern:

#include <iostream>

using namespace std;

extern int var; 
           
int main(){
    cout<<var;    
    return 0; 
}

如果您的“第一个 .cpp”增长,并且您开始添加其他模块将要使用的东西,那么您可能想要:

  • 定义一个或多个classes
  • 为您的 class 定义创建头文件

每个翻译单元必须包含它使用的每个符号的声明。另一方面,每个符号必须在一个翻译单元中有一个定义(除非它是显式或隐式的inline;那么多个翻译单元可以有定义,只要它们'都一样)。

通常的做法是将声明放在header文件中,然后#include进入多个翻译单元,同时将它们的 定义 放入构成翻译单元主要 body 的 .cpp 文件中。


在这种特殊情况下,您需要在包含 main 的翻译单元中声明 var。你可以把它放在一个 header 中,使 #included 变成 file1.cpp;即:

file2.hpp:

#ifndef FILE1_HPP
#define FILE1_HPP

extern int var;

#endif

file2.cpp:

#include "file2.hpp"

int var;

file1.cpp:

#include "file2.hpp"
#include <iostream>

int main() {
    std::cout << var;
}

或者您只是手动将其放入那个翻译单元;即

#include <iostream>

extern int var;

int main()
{
    std::cout << var;
}

从编译器的角度来看,这两种方法都完全相同(预处理器只是进行文本替换),但后者对人类来说往往更难处理,因此您通常应该避免使用它。

基本上问题是我使用 gcc -o myprogram learn.cpp help.cpp 而不是 g++ -o myprogram learn.cpp help.cpp 来编译。 Gcc 编译器用于 .c 文件,g++ 用于 .cpp 文件