C++:使用GCC编译器链接文件

lek*_*oif 2 c++ linker declaration undefined-reference

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

myh.h

extern int foo;
void print_foo();
void print(int);
Run Code Online (Sandbox Code Playgroud)

my.cpp

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

use.cpp

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

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
Run Code Online (Sandbox Code Playgroud)

我使用-c命令编译文件,它不会给出错误.我使用以下命令进行链接:

g++ -o final my.o use.o
Run Code Online (Sandbox Code Playgroud)

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

好奇的是,这是Stroustrup的"使用C++编程原则"一书中的练习练习

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

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

哪个告诉我它在my.cpp中也没有定义呢?如果我必须在任何地方定义它在头文件中包含它的重点是什么,或者如何更恰当地接近它?

das*_*ght 8

您收到链接器错误,因为您已声明 foo,但您从未定义它.

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

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