我正在一起编译2个C ++文件。 4如果包含头文件。问题是,当链接器尝试将文件链接在一起时,我不断收到“重复符号”错误。
这是我的档案。
main.h
int test2();
main.cc
#include "main.h"
#include "test.h"
int test2(int test) {
return 0;
}
int main() {
test2(test());
return 0;
}
test.h
int hello = 10;
int test();
test.cc
#include <iostream>
#include "test.h"
using namespace std;
int test() {
cout << hello << endl;
return 0;
}
我认为我做的事情很简单。有人可以指出我做错了什么。 这是我正在编译文件的方式。
c++ main.cc test.cc -o main
这是我得到的错误:
duplicate symbol _hello in:
/var/folders/nj/568_95bj4dg9v11l_mksv_2m0000gn/T/main-3becdd.o
/var/folders/nj/568_95bj4dg9v11l_mksv_2m0000gn/T/test-e84473.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
答案 0 :(得分:9)
在头文件中,声明变量:
extern int hello;
在一个源文件中,定义变量:
int hello = 10;
不要在标题中定义变量 - 这相当于在包含标题的每个源文件中定义变量,以及导致链接器错误的原因。
答案 1 :(得分:0)
您可以简单地将hello定义为“静态”(全局)变量
float *fp = malloc(4);
...
startSlowCalculation(); // Use some pipelined computation unit
int *ip = (int*)fp;
...
b=*ip;
*fp = resultOfSlowCalculation(); // ** Moved from up above
somethingElse = *fp;
...
c=*ip;
在类似的问题中提到了更多信息: