【发布时间】:2014-08-31 19:37:26
【问题描述】:
嘘。我在定义我的课程时遇到了臭名昭著的LNK2005 错误,我似乎无法解决问题。
(我正在撕开我的一个同样臭名昭著的单身人士,以便很好地反映,组织。)最初所说的单身人士被编码......以如此不同的,出色的方式......以避免所有C++ OPP 原则和概念我当时一无所知,但它确实有效! ....不知何故。尽管它确实是一些最简单的 C++ 概念的侥幸。现在我需要组织、编译速度和先进的结构化技术来让它快速工作,你明白了。
A-无论如何。在拆分它并不得不重写一些之后,我注意到了一种必要性。我必须声明多个 .cpp 文件,因为编译器被双重声明和通常的头类定义所困扰。
此外,我已根据需要使用了相应的预处理器指令。但仍有一些问题。
注意(编辑):我已经重写了问题以提供给定的错误。
考虑:
D3D.h
#include "Infinity.h"
class Direct3D :
public Infinity
{
public:
Direct3D();
~Direct3D();
IDXGISwapChain *Swapchain; //Display modes.
static ID3D11Device *Device;
static ID3D11DeviceContext *DeviceContext;
static ID3D11RenderTargetView *RenderTargetView;
void D3D_Start(float width, float height);
void D3D_Render();
void D3D_Terminate();
void ViewPort(float Height, float Width, float MaxDepth, float MinDepth, float TopLeftX, float TopLeftY);
}Direct3D;
...和Windows.h
#include "Infinity.h"
class Windows :
public Infinity
{
public:
Windows();
~Windows();
bool DisplayWindow(int width, int height, HINSTANCE hInstance);
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
}Windows;
最后,Infinity.h
#pragma once
class Infinity{
public:
Infinity();
~Infinity();
static HWND hWnd;
};
而所有实现都在各自的 .cpp 文件中。除了#pragma,我还使用了#ifndef ...#endif。我怀疑我可能无意中通过自动初始化头文件中的类来调用一种实现。但它看起来非常 kosher,并允许我将函数成员声明为:
Direct3D.D3D_Start() 没有声明静态成员 Direct3D::D3D_Start()。
我的标题应该都是静态的吗?
编辑:下面是.cpp 文件:
#include "stdafx.h"
#include "Infinity.h"
#include "Windows.h"
#include "Direct3D.h"
MSG msg;
float width = 1024;
float height = 768;
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
windows.DisplayWindow(1280, 900, hInstance);
direct3D.D3D_Start(width, height);
direct3D.ViewPort(height, width, 1.0f, 0.0f, 0, 0);
while (WM_QUIT != msg.message){
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else{
direct3D.D3D_Render();
}
}
direct3D.D3D_Terminate();
return msg.wParam;
}
*更新 .cpp 已更改为显示 Niall 的解决方案。
编辑:
问题:
我是否遇到了 LNK2005 问题,因为我在其头文件中自动初始化了我的类,考虑到 Stack Overflow 问题的解决方案:
VS 2010 C++ LNK2005 errors while using #pragma once and #ifndef
根据我对解决方案的理解,这似乎不起作用。
编译器
VS2013 返回:
Error 1 error LNK2005: "class Direct3D Direct3D" (?Direct3D@@3V0@A) already defined in Direct3D.obj C:\Users\InfinityMachine\documents\visual studio 2013\Projects\Win32Project3\Win32Project3\Win32Project3.obj Win32Project3
Error 2 error LNK2005: "class Windows Windows" (?Windows@@3V0@A) already defined in Win32Project3.obj C:\Users\InfinityMachine\documents\visual studio 2013\Projects\Win32Project3\Win32Project3\Windows.obj Win32Project3
Error 3 error LNK1169: one or more multiply defined symbols found C:\Users\InfinityMachine\documents\visual studio 2013\Projects\Win32Project3\Debug\Win32Project3.exe 1 1 Win32Project3
【问题讨论】:
-
完全不清楚你在问什么。
-
@RSahu 我编辑了主要问题以进行澄清。
-
I must declare multiple .cpp files没有声明“.cpp 文件”。一个声明一个类、一个函数或一个变量。Should my headers all be static?没有静态标头之类的东西。有静态类成员。Main.h“Infinity.h”在哪里?Am I getting the LNK2005 issue如果没有您遇到的错误列表(逐字记录!)并且没有 MCVE(请注意所有字母都很重要),我们只能做出没有根据的猜测。 -
@n.m.注意:
.ccp文件未以编程方式声明;它们得到了实施。标题不是静态的,其中的类成员是,暗示x::y(),static y。随着人类语言的发展,同时使用隐喻符号和明确定义来描述问题,将生物固件习语编织到英语中。为了进一步澄清,重新编辑了该问题。 -
为什么要立即声明
class Direct3D... } Direct3D和同名变量?这可能是错误的原因。
标签: c++ class data-structures preprocessor-directive lnk2005