c ++多定义符号

时间:2011-07-29 21:53:54

标签: c++ linker directx undefined

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

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"

我为gc.h中的d3ddevice和directx符号的多定义符号不断收到链接器错误。我不知道如何将gc.h包含到dx9d3d.h中而不是多重定义的符号:/请帮助我对这些链接器错误提出一个菜鸟。

并且是gc.h中的代码

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

并且继承了错误

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  

2 个答案:

答案 0 :(得分:1)

通常,这种类型的构造在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

答案 1 :(得分:1)

问题出现是因为项目包含main.cppdx9d3d.cpp,其中包括dx9d3d.h,其中包含gc.h,因此gc.h包含两次xaD3D总计,因此#ifndef GC_H #define GC_H ... #endif 定义了两次。

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

#pragma once

另一种方法是在头文件中使用{{1}}(如果支持)。