我有四个要编译的C ++文件。两个是.h,两个是.cpp。我创建了一个生成文件,该文件生成两个对象,并使用g ++对其进行编译。在.h文件之一中定义了一个int,链接器坚持将其定义两次。我究竟做错了什么? 这些是源文件:
“ foo.cpp”
#include "foo.h"
#include "bar.h"
int main ()
{
X();
}
“ foo.h”
#ifndef j
#define j
bool a;
#endif
“ bar.cpp”
#include "bar.h"
int X()
{
b = 0;
return b;
}
“ bar.h”
#ifndef k
#define k
int b;
int X();
#endif
“ Makefile”
exec: foo.o bar.o
g++ -oexec foo.o bar.o
foo.o: foo.cpp foo.h
bar.o: bar.cpp bar.h
这是我得到的编译错误:
/usr/bin/ld: bar.o:(.bss+0x0): multiple definition of `b'; foo.o:(.bss+0x4): first defined here
collect2: error: ld returned 1 exit status
P.S。不,这不是作业的一部分。我为这篇文章做了一个简化的例子。
答案 0 :(得分:1)
您定义了变量
bool a;
int b;
在头文件中,这些头文件将其包含在多个源代码中,每个源代码都在结果对象文件中创建了一个定义。
您应该避免在头文件中声明变量(非静态类成员除外)。如果确实需要在头文件中传达这样一个变量的存在,请将其声明为extern
:
// foo.h
extern int b; // declares the existence of a variable named b
// foo.cpp
#include foo.h
int b; // keeps the promise made in foo.h
// bar.h
#include foo.h
b = 2; // modifies the variable b in foo.cpp