用GCC编译器链接文件

C++: Linking files with GCC compiler

本文关键字:文件 链接 编译器 GCC      更新时间:2023-10-16

我有三个文件:myh.h;my.cpp;use.cpp。以下是文件的内容:

myh.h

extern int foo;
void print_foo();
void print(int);

my.cpp

#include "myh.h"
#include <iostream>
void print_foo()
{
    std::cout<<foo<<std::endl;
}
void print(int i)
{
    std::cout<<i<<std::endl;
}

use.cpp

#include "myh.h"
int main()
{
    foo=7;
    print_foo();
    print(99);
    return 0;
}

GCC显示以下错误:

my.o:my.cpp:(.text+0x7): undefined reference to `foo'
use.o:use.cpp:(.text+0x10): undefined reference to `foo'
collect2: ld returned 1 exit status

我使用-c命令编译文件,它没有给出错误。我使用以下命令链接:

g++ -o final my.o use.o

这里有什么问题,我读过其他有类似问题的话题,这里的情况很奇怪.....

对于好奇的人来说,这是Stroustrup的书《使用c++的编程原理》中的练习练习

编辑:我按照dasblinkenlight所说的做了,并且在use.cpp中,我在foo前面添加了一个int(所以现在定义了foo),但我仍然得到这个错误:

my.o:my.cpp:(.text+0x7): undefined reference to `foo'
collect2: ld returned 1 exit status

这告诉我,它没有定义在我的。cpp也?如果我必须在任何地方定义它,那么在头文件中包含它的意义是什么,或者应该如何更适当地接近它?

你得到一个链接错误,因为你声明 foo,但你从来没有定义它。

extern int foo只是一个声明;它不会导致foo变量的内存分配,只是承诺您将在其他地方进行分配。要修复它,您需要将这一行添加到其中一个cpp文件中,如下所示:

#include "myh.h"
int foo;
int main()
{
    foo=7;
    print_foo();
    print(99);
    return 0;
}

问题是声明了foo但没有定义。您需要在一个翻译单元中定义foo,例如:

int foo = 0;