“用F ++编译时未定义的引用”

问题描述 投票:0回答:1

我有三个文件:

my.cpp

#include "my.h"
#include <iostream> 

void print_foo() {
    cout << foo << '\n';
}

void print(int i) {
    cout << i << '\n'; 
}

my.h

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

use.cpp

#include "my.h"

int main(int argc, char *argv[]) {
    foo = 7;
    print_foo();
    print(99);
    return 0;
}

现在运行g++ my.cpp use.cpp时出现错误

/usr/bin/ld: /tmp/ccUKJUlZ.o: in function `print_foo()':
my.cpp:(.text+0x6): undefined reference to `foo'
/usr/bin/ld: /tmp/ccN0mIhY.o: in function `main':
use.cpp:(.text+0x11): undefined reference to `foo'
collect2: error: ld returned 1 exit status

另外,如果我运行g++ -c my.cpp,一切都会好起来,但是,如果我再运行g++ my.o use.cpp,则会得到相同的错误。

c++ g++
1个回答
0
投票

您从未真正定义变量foo-在use.cppmy.cpp中都使用 foo,在my.h中您声明作为变量extern

有关声明与定义的更多信息,请参见this response的开头。您可能会认为,如果在foo = 7use.cpp行前面添加了类型,则可以解决您的问题;但是,您还需要做的是使foo成为global variable而不是局部变量(当您仅在main中声明它时就是局部变量),因为extern仅会“查找”变量具有全球范围。您可以通过在任何函数外部声明变量来使变量成为全局变量(旁注-仅当绝对have到时才应使用全局变量)。

因此,您可以通过将use.cpp更改为以下内容来解决问题:

#include "my.h"

int foo = 7;
int main(int argc, char *argv[]) {
    print_foo();
    print(99);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.