2

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

我的

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

我的.cpp

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

使用.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

这告诉我它也没有在 my.cpp 中定义?如果我必须在任何地方定义它,将它包含在头文件中的意义何在,或者应该如何更恰当地处理它?

4

2 回答 2

8

你得到一个链接器错误,因为你声明 foo了,但你从未定义它。

extern int foo只是一个声明;它不会导致为foo变量分配内存,只会保证您将在其他地方执行此操作。要修复它,您需要将此行添加到其中一个 cpp 文件中,如下所示:

#include "myh.h"
int foo;
int main()
{
    foo=7;
    print_foo();
    print(99);
    return 0;
}
于 2012-12-30T02:37:48.843 回答
3

问题是foo已声明但未定义。您需要foo在其中一个翻译单元中进行定义,例如:

int foo = 0;
于 2012-12-30T02:37:53.120 回答