C++ c++;多定义符号

C++ c++;多定义符号,c++,linker,directx,undefined,C++,Linker,Directx,Undefined,所以我有一个dll,它为我的程序保存了一些函数。称为gc.dll,我在主项目中将其作为参考。在我的主项目中,我有两个标题和两个源文件 dx9d3d.h main.h main.cpp dx9d3d.h 这是我在每个档案上的记录 dx9d3d.h: #include "gc.h" dx9d3d.cpp: #include "dx9d3d.h" main.h: #include <Windows.h> #include <stdio.h> #include <

所以我有一个dll,它为我的程序保存了一些函数。称为gc.dll,我在主项目中将其作为参考。在我的主项目中,我有两个标题和两个源文件

dx9d3d.h
main.h


main.cpp
dx9d3d.h
这是我在每个档案上的记录

dx9d3d.h:
#include "gc.h"


dx9d3d.cpp:
#include "dx9d3d.h"

main.h:
#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
#include "basics.h"
#include "dx9d3d.h"

main.cpp:
#include "main.h"
错误就在这里

2>main.obj : error LNK2005: "struct IDirect3DDevice9 * xaD3D::d3dDev" (?                     d3dDev@xaD3D@@3PAUIDirect3DDevice9@@A) already defined in dx9d3d.obj
2>main.obj : error LNK2005: "struct IDirect3D9 * xaD3D::d3d" (?     d3d@xaD3D@@3PAUIDirect3D9@@A) already defined in dx9d3d.obj  

通常,多个包含错误的C++在这种类型的构造中得到解决:

#ifndef GC_Header
#define GC_Header
//header code enclosed here
#endif //GC_Header
尝试在gc.h头文件的开头和结尾添加这些指令。您的
gc.h
文件应如下所示:

#ifndef GC_Header
#define GC_Header

namespace xaD3D {
__declspec(dllexport) LPDIRECT3D9 d3d;
__declspec(dllexport) LPDIRECT3DDEVICE9 d3dDev;
    __declspec(dllexport) bool initD3D(HWND hWnd);
}
#endif //GC_Header

HTH,
JP

出现问题是因为项目包含
main.cpp
dx9d3d.cpp
,两者都包含
dx9d3d.h
,其中包含
gc.h
,因此
gc.h
总共包含两次,因此
xaD3D
定义两次

正如@John Paul所说,通常的解决方案是将定义封装在#ifndef/#endif中:


另一种方法是在头文件中使用
#pragma一次
(如果支持)。

gc.h和dx9d3d.h中的内容是什么答案很可能就在那里。请向我们显示准确的错误消息,并包括定义这些对象的代码。头文件通常声明对象,而不是定义对象,因此它们在诊断链接器错误时通常不重要。这是一个很好的建议,他应该这样做,但是看起来他不会多次包含头文件。“pragma one”也可以使用,因为现在大多数编译器都支持它(我实际上不知道有哪一个不支持它)@celavek true..但它是非标准的,这就是为什么我建议它确实不是。但我并不是在暗示:),我是说它是一个确实以实现定义的方式运行的替代方案;在以下链接基础上有很好的细节。h没有链接到gc.h,我的代码现在看起来像这样,它不起作用#如果ndef gc#u h#define gc#u h#declspec(dllexport)void mbA(字符串文本)__declspec(dllexport)void mbB(字符串文本)__declspec(dllexport)void mbC(字符串文本);命名空间xaD3D{uuuudeclspec(dllexport)LPDIRECT3D9 d3d;uudeclspec(dllexport)LPDIRECT3DDEVICE9 d3dDev;uudeclspec(dllexport)bool initD3D(HWND HWND);}endif将代码定义移动到.cpp中不是更有效地解决问题吗?
#ifndef GC_Header
#define GC_Header

namespace xaD3D {
__declspec(dllexport) LPDIRECT3D9 d3d;
__declspec(dllexport) LPDIRECT3DDEVICE9 d3dDev;
    __declspec(dllexport) bool initD3D(HWND hWnd);
}
#endif //GC_Header
#ifndef GC_H
#define GC_H
...
#endif