【问题标题】:c++ multi defined symbolc++ 多定义符号
【发布时间】:2011-07-29 21:53:53
【问题描述】:

所以我有这个 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  

【问题讨论】:

  • gc.h 和 dx9d3d.h 里面有什么? -- 答案很可能就在那里。
  • 请向我们展示确切的错误消息,并包括您定义这些对象的代码。头文件通常声明对象,而不是定义它们,因此它们通常在诊断链接器错误时并不重要。

标签: c++ linker directx undefined


【解决方案1】:

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

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

#ifndef GC_H
#define GC_H
...
#endif

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

【讨论】:

  • 将代码定义移到 .cpp 中不是更有效地解决问题吗?
【解决方案2】:

通常在 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

【讨论】:

  • 好建议,无论如何他都应该这样做,但是看起来他并没有多次包含头文件。
  • "#pragma once" 也可以使用,因为现在大多数编译器都支持它(我实际上不知道不支持它的编译器)
  • @celavek true.. 但是#pragma once 是非标准的,这就是为什么我建议include guards
  • 确实不是。但我并没有以任何方式暗示:),我是说它是一种替代方案,它确实以实现定义的方式表现;以下链接中的详细信息stackoverflow.com/questions/4563356/…
  • basics.h 没有链接到 gc.h,我的代码现在看起来像这样,它不起作用 #ifndef gc_h #define gc_h __declspec(dllexport) void mbA(string text); __declspec(dllexport) void mbB(string text); __declspec(dllexport) void mbC(string text);命名空间 xaD3D { __declspec(dllexport) LPDIRECT3D9 d3d; __declspec(dllexport) LPDIRECT3DDEVICE9 d3dDev; __declspec(dllexport) bool initD3D(HWND hWnd); } #endif
猜你喜欢
  • 2011-07-19
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多