我有三个文件:
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
,则会遇到相同的错误。
答案 0 :(得分:1)
您从未真正定义变量foo
-在use.cpp
和my.cpp
中,您都使用 foo
,然后在my.h
中将其声明为extern
。
有关声明与定义的更多信息,请参见this response的开头。您可能认为,如果您在foo = 7
的{{1}}行前面添加了一个类型,则可以解决您的问题;但是,您还需要做的是将use.cpp
设为全局变量,而不是本地变量(当您仅在foo
中声明该变量时),即为{{ 1}}将仅“查找”具有全局范围的变量。您可以通过在任何函数外部声明变量来使变量成为全局变量(注意-您仅应在必须拥有时才使用全局变量)。
因此,您可以通过将main
更改为以下内容来解决问题:
extern