C++ 包括不工作的警卫?(y.obj中已经定义了500个LNK2005X类型的错误)

C++ 包括不工作的警卫?(y.obj中已经定义了500个LNK2005X类型的错误),c++,linker,lnk2005,C++,Linker,Lnk2005,我有一个大项目(400个文件),所有的标题都包含了警卫和所有东西,但是我得到了500个LNK2005错误 可能是我在一些标题中定义了函数体吗?因为我在DirectX实用程序标题中看到了相同的东西(DirectXCollision的一些功能完全在标题中) 或者可能是因为他们使用的是.inl文件而不是.cpp文件 可能是我在一些标题中定义了函数体吗 是的,可能是这样。在多个翻译单元中定义函数会导致重复符号定义错误 通过声明那些函数inline,可以绕过复制错误。[7.1.2]/2内容如下: 带有内联

我有一个大项目(400个文件),所有的标题都包含了警卫和所有东西,但是我得到了500个LNK2005错误

可能是我在一些标题中定义了函数体吗?因为我在DirectX实用程序标题中看到了相同的东西(DirectXCollision的一些功能完全在标题中)

或者可能是因为他们使用的是.inl文件而不是.cpp文件

可能是我在一些标题中定义了函数体吗

是的,可能是这样。在多个翻译单元中定义函数会导致重复符号定义错误

通过声明那些函数
inline
,可以绕过复制错误。[7.1.2]/2内容如下:

带有内联说明符的函数声明(8.3.5、9.3、11.3)声明内联函数。内联说明符向实现表明,在调用点对函数体进行内联替换要优于通常的函数调用机制。在调用点执行此内联替换不需要实现;但是,即使省略了此内联替换,也应遵守7.1.2中定义的内联函数的其他规则

可能是我在一些标题中定义了函数体吗

是的,可能是这样。在多个翻译单元中定义函数会导致重复符号定义错误

通过声明那些函数
inline
,可以绕过复制错误。[7.1.2]/2内容如下:

带有内联说明符的函数声明(8.3.5、9.3、11.3)声明内联函数。内联说明符向实现表明,在调用点对函数体进行内联替换要优于通常的函数调用机制。在调用点执行此内联替换不需要实现;但是,即使省略了此内联替换,也应遵守7.1.2中定义的内联函数的其他规则


Include guards只会使您避免多次将相同的头包含到相同的编译单元(一个cpp文件)中。如果您将头文件包含到第二个cpp文件中,然后将它们链接在一起,那么这两个文件都将具有头文件带来的任何内容。这就是为什么在头文件中包含函数实现通常是个坏主意


您可以通过内联声明函数来解决这一问题,然后编译器将复制/粘贴它们。

包含保护只会避免您将相同的头多次包含到相同的编译单元(一个cpp文件)中。如果您将头文件包含到第二个cpp文件中,然后将它们链接在一起,那么这两个文件都将具有头文件带来的任何内容。这就是为什么在头文件中包含函数实现通常是个坏主意


您可以通过内联声明函数来解决这个问题,然后编译器将复制/粘贴它们。

在头文件中定义全局变量吗?这可能是错误的原因之一。 包括警卫也帮不上忙

全局变量应仅在一个转换单元中定义,并应在所有其他转换单元中外部定义

例如。 在x.h,你有

int myVar;
现在你把x.h包括在a.cpp和b.cpp中, 然后,即使在x.h中包含了防护,也会出现链接器错误


因为现在myVar将在a.obj和b.obj中定义,链接器将找到2个myVar。

是否在头文件中定义全局变量?这可能是错误的原因之一。 包括警卫也帮不上忙

全局变量应仅在一个转换单元中定义,并应在所有其他转换单元中外部定义

例如。 在x.h,你有

int myVar;
现在你把x.h包括在a.cpp和b.cpp中, 然后,即使在x.h中包含了防护,也会出现链接器错误


因为现在myVar将在a.obj和b.obj中定义,链接器将找到2个myVar。

是否确定标记函数
内联
将链接更改为内部?另外,
inline
利用编译器的魔力来防止ODR冲突和链接器错误,但这些函数仍然具有外部链接。参见。@Praetorian:标准甚至说(在注释中)“内联关键字对函数的链接没有影响”。您确定标记函数
inline
会将链接更改为内部链接吗?另外,
inline
利用编译器的魔力来防止ODR冲突和链接器错误,但这些函数仍然具有外部链接。请参阅。@Praetorian:标准甚至说(在注释中)“内联关键字对函数的链接没有影响”。我设法修复了一些,但仍有大约170个,所有剩余的都是碰撞造成的。obj告诉我:[[Error 18 Error LNK2005:[void\U cdecl Awesome::CLISION::Internal::FastIntersectTrianglePlane(联管m128,联管m128,联管m128,联管m128,联管m128常数和,联管m128和,联管m128和)?FastIntersectTrianglePlane@Internal@Collision@Awesome@@YAXT_uuM128@@00ABT4@AAT4@2@Z)已经在Collision.obj]-]]]中定义,但是每个函数都在Collision.h中定义,在Collision.cpp中有一个body,它甚至给了我“alredy defined in Collision.obj”在collision.obj文件中,xDI设法修复了一些,但仍然保留了大约170个,所有剩余的都是来自collision.obj,它告诉我:[[Error 18 Error LNK2005:“void\uu cdecl Awesome::collision::Internal::fasintersecttriangelplane(union\uuuum128,union\um128,union\uuum128,union\uuum128 const&,union\uuuuuum128&)”(?FastIntersectTrianglePlane@Internal@Collision@Awesome@@YAXT_uuM128@@00ABT4@AAT4@2@Z)已在Collision.obj]]-]中定义,但每个函数都在Collision.h中定义,在Collision.cpp中都有一个body,它甚至在Collision.obj文件xD中为我提供了“alredy defined in Collision.obj”