C++ .obj文件中已定义了错误LNK2005结构

C++ .obj文件中已定义了错误LNK2005结构,c++,compilation,include,pragma,C++,Compilation,Include,Pragma,我一直在努力解决一个关于编译单元的问题 我得到的错误是 1>frtinvxml.obj : error LNK2005: "struct repFieldInfo det_rep_info" (?det_rep_info@@3UrepFieldInfo@@A) already defined in Frtinv.obj 1>frtinvxml.obj : error LNK2005: "struct repFieldInfo frt_rep_info" (?frt_rep_info@

我一直在努力解决一个关于编译单元的问题

我得到的错误是

1>frtinvxml.obj : error LNK2005: "struct repFieldInfo det_rep_info" (?det_rep_info@@3UrepFieldInfo@@A) already defined in Frtinv.obj
1>frtinvxml.obj : error LNK2005: "struct repFieldInfo frt_rep_info" (?frt_rep_info@@3UrepFieldInfo@@A) already defined in Frtinv.obj
1>frtinvxml.obj : error LNK2005: "struct FormToolbar * tb" (?tb@@3PAUFormToolbar@@A) already defined in Frtinv.obj
1>frtinvxml.obj : error LNK2005: "struct tagDATE_STRUCT dateFrom" (?dateFrom@@3UtagDATE_STRUCT@@A) already defined in Frtinv.obj
... (It goes on for every variable and method in the header...)
这是我唯一的错误。下面是每个相关类的包含,按从树上最高到最低的顺序排列

***Frtinv.hxx***
#pragma once

#include <voyage.ddh>
#include <vsched.ddh>
# ...

struct frtinvType : public frtinv_type
    {
    int     fixCarSeq;
    ...
***Frtinv.hxx***
#布拉格语一次
#包括
#包括
# ...
结构frtinvType:公共frtinv_类型
{
int fixCarSeq;
...

***frtinv.cxx***
//#在_MAIN中定义_
#包括
... 
#定义RINDEX 2
#定义LINDEX 2
#定义PINDEX 0
BOOL s_fNeedSaveAfterDelete=FALSE;
静态int-rateCnt=RINDEX,lumpCnt=LINDEX,pcntCnt=PINDEX;
//------------------------------------------------------------------------
int getPortcar(char*vslCode、int voyNo、int portCallSeq、int bertseq、int seq、portcar_type*pret)
...

***frtinvxml.h***
#在_MAIN中定义_
#包括
#包括
#包括
#包括
#包括
#包括
#include
#pragma once
防止在单个编译单元(本例中为.obj文件)中多次包含头,错误明确表示frtinvxml.obj定义了已经在Frtinv.obj中定义的内容。两个单独的obj。两个单独的编译单元

一次
在Frtinv.obj和frtinvxml.obj的情况下都能很好地工作。两者都只有一个定义,否则源代码就不会编译。不幸的是,链接器试图将两个obj放在同一个输出中

这有两种解决方案,具体取决于变量的使用方式,但这两种方法都不会在头文件中声明。结果几乎总是很糟糕

解决方案1:所有对象共享一个变量 定义:

extern struct repFieldInfo det_rep_info;
在适当的标题中。将声明某个地方的
det_rep_info
,编译应继续使用此外部
det_rep_info

在cpp文件frtinvxml.cpp、Frtinv.cpp或包含公共数据的第三个cpp中,声明

struct repFieldInfo det_rep_info;
然后对其他三个重复的变量执行相同的操作

将这些变量精确放置在何处取决于个人喜好、选择和编码标准。编译此文件并将其与其他.obj文件链接,以便每个人都可以访问该变量

解决方案2:所有对象都有自己的私有变量 宣布:

static struct repFieldInfo det_rep_info;
在每个需要它的cpp文件中。对所有需要的变量重复此操作。
static
确保每个
det_rep_info
仅在特定范围内可见。在这种情况下,只有一个编译单元。其中实际上有一点微妙之处,以确保
static
适合您


您可以将声明放在标头中,标头的每个includer都将获得自己的副本,但需要注意的是,标头的每个includer都将获得一个副本,无论他们是否需要。不要为其他人做出此决定。在需要它的cpp文件中声明变量。如果缺少一个,编译器将捕获它。

Th你很有帮助。这是我第一次用C++工作(当然它还在工作中),谢谢你的理解。
extern struct repFieldInfo det_rep_info;
struct repFieldInfo det_rep_info;
static struct repFieldInfo det_rep_info;