好吧,我几天来一直在努力解决这个问题。我正在从头开始为CryENGINE编写一个自定义游戏DLL,我甚至无法通过一个简单的类(Game.cpp)和一个预编译的头(StdAfx.h)来编译解决方案。
Game.cpp和StdAfx.cpp都可以完全自行编译,但编译解决方案会产生大量的多重定义错误。类很简单,因为定义只是占位符。
Game.h
#if !defined __GAME__H__
#define __GAME__H__
#pragma once
class CGame : public IGame
{
public:
CGame();
VIRTUAL ~CGame();
//IMPLEMENT: IGame Interface, all methods declared.
};
#endif
Game.cpp
#include "StdAfx.h" //PreComp header
#include "Game.h"
//Define all methods, each one has a simple definition.
的StdAfx.h
#if !defined __STDAFX__H__
#define __STDAFX__H__
#pragma once
//Various CryENGINE includes
#endif
输出
error LNK2005: "struct SSystemGlobalEnvironment * gEnv" (? gEnv@@3PEAUSSystemGlobalEnvironment@@EA) already defined in StdAfx.obj
error LNK2005: "public: static long volatile _CryMemoryManagerPoolHelper::allocatedMemory" (?allocatedMemory@_CryMemoryManagerPoolHelper@@2JC) already defined in StdAfx.obj
error LNK2005: "public: static long volatile _CryMemoryManagerPoolHelper::freedMemory" (?freedMemory@_CryMemoryManagerPoolHelper@@2JC) already defined in StdAfx.obj
error LNK2005: "public: static long volatile _CryMemoryManagerPoolHelper::requestedMemory" (?requestedMemory@_CryMemoryManagerPoolHelper@@2JC) already defined in StdAfx.obj
error LNK2005: "public: static int volatile _CryMemoryManagerPoolHelper::numAllocations" (?numAllocations@_CryMemoryManagerPoolHelper@@2HC) already defined in StdAfx.obj
The list goes on...
真正让我失望的是每个人都会单独编译,所以语法和引用都很好。当解决方案作为一个整体编译时,什么可能导致多重定义的错误?
我非常感谢这个令人沮丧的问题的帮助,谢谢。
答案 0 :(得分:3)
我不确定错误是由预编译头引起的,但这是设置预编译头的正确方法:
在解决方案资源管理器中右键单击项目名称,选择属性,转到配置属性| C / C ++ |预编译标题并将预编译标题设置为使用(/ Yu)。将其下面的其他两个设置保留为默认设置。
右键单击StdAfx.cpp,转到相同的设置并将其设置为创建(/ Yc)。
答案 1 :(得分:1)
好吧,我明白了。有一个聪明的复杂包含不属于预编译头:
#include <Platform_Impl.h>
这引起了我的所有问题,并将其移至Game.cpp,一切都很好。