c ++ мультиопределенный символ - PullRequest
2 голосов
/ 30 июля 2011

Итак, у меня есть эта 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"

Я продолжаю получать ошибку компоновщика для мультиопределенных символов для символов d3ddevice и directx, которые есть в моем gc.h. Я понятия не имею, как я могу включить 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 ]

1 голос
/ 30 июля 2011

Проблема возникает из-за того, что проект содержит main.cpp и dx9d3d.cpp, оба из которых включают dx9d3d.h, который включает gc.h, поэтому gc.h включается в общей сложности дважды, и, следовательно, xaD3D определяетсядважды.

Как сказал @Джон Пол, обычное решение - обернуть определение в # ifndef / # endif:

#ifndef GC_H
#define GC_H
...
#endif

Альтернативой является использование #pragma once (если поддерживается)в заголовочном файле.

1 голос
/ 30 июля 2011

Обычно множественные ошибки включения решаются в 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

...