2012-06-11 46 views
0

所以发生了什么事:链接多个文件的问题

在一开始,有一个主要的源文件。它在几秒钟内编译完成,但是它大约有1000行,所以我开始将它分成单独的.h/.cpp组合。好消息是,我的主要来源的长度现在约为500行,但坏消息是我无法完全编译/链接它。

所以我一直在这一段时间,但它没有得到任何改善。

下面是一个概述(or no overview):

有四个源文件:

  • corbit.cpp(主),

  • initialization.cpp(初始化实体的载体), (实体类文件),

  • display.cpp(HUD和相机类文件)。

Main包含所有其他源文件,如“display.h”。另外,(例如)allegro.h。

display.cpp包括 “entity.h”(带的#ifndef ENTITY_H后卫的东西),和 “display.h”,以及(例如)allegro.h

entity.cpp包括“实体.H”

initialization.cpp包括(再次与#ifndef保护) “entity.h”,以及 “initialization.h”

当我打编译代码块,使用GCC,它开辟了locale_facets.tcc(任何人都知道这是什么?)作为一个空文件。这也给了我两个错误信息,如下所示:

  • corbit.o在功能 'ZNSt6vectorIP10physical_tSaIS1_EE5clearEv'

  • display.o:[项目目录] .. \ LIB \ GCC \的mingw32 \ 3.4。 5 ........ \包括\ C++ \ 3.4.5 \位\ locale_facets.tcc(线2497)(这里第一定义)< - 高亮红

  • corbit.o在函数 'ZNSt6vectorIP10physical_tSaIS1_EE5clearEv'

  • display.o:项目目录] .. \ lib中\ GCC \的mingw32 \ 3.4.5 ........ \包括\ C++ \ 3.4 0.5 \位\ locale_facets.tcc(线2497)(这里第一定义)< - 高亮红

,看起来是相同的。在我的主体中,我声明了

std::vector<physical_t*> entity; 

(physical_t是实体类),这可能与第一条消息有关。

在每个.h文件中我有

#ifndef FILENAME_H 
#define FILENAME_H 
[declarations] 
#endif 

每当我包括不与.cpp文件我包括它对应一个头,我将其括在

#ifndef FILENAME_H 
#include "filename.h" 
#endif 

我的确有不同的.cpp文件,包括iostream,math.h,allegro.h,以及类似的东西,这样他们定义的函数就可以编译而不会出现语法错误。

使用Windows,codeblocks,gcc。我想不出别的什么。帮助将不胜感激!

+0

实际上有physical_t *附近的尖括号,但我无法弄清楚如何在堆栈溢出中执行这些操作。 – pmelanson

+2

已为您修复此问题。 –

+0

尽管我并不确定,但我的直接猜测是,它可能会更容易从一个可用的大文件中解决此问题,而不是已经拆分的文件,但不再是您发布的工作文件。 –

回答

0

是否包含其他源文件成主要来源?你不应该这样做,特别是如果你在几个源文件中包含相同的头文件。

您应该自行编译每个源文件,并使用链接器将这些文件链接在一起。