带预编译头的多重定义符号?

时间:2013-02-06 08:37:32

标签: visual-c++ compiler-errors precompiled-headers cryengine

好吧,我几天来一直在努力解决这个问题。我正在从头开始为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...

真正让我失望的是每个人都会单独编译,所以语法和引用都很好。当解决方案作为一个整体编译时,什么可能导致多重定义的错误?

我非常感谢这个令人沮丧的问题的帮助,谢谢。

2 个答案:

答案 0 :(得分:3)

我不确定错误是由预编译头引起的,但这是设置预编译头的正确方法:

  1. 在解决方案资源管理器中右键单击项目名称,选择属性,转到配置属性| C / C ++ |预编译标题并将预编译标题设置为使用(/ Yu)。将其下面的其他两个设置保留为默认设置。

  2. 右键单击StdAfx.cpp,转到相同的设置并将其设置为创建(/ Yc)

答案 1 :(得分:1)

好吧,我明白了。有一个聪明的复杂包含不属于预编译头:

#include <Platform_Impl.h> 

这引起了我的所有问题,并将其移至Game.cpp,一切都很好。