【问题标题】:Linking troubles with multiple files链接多个文件的问题
【发布时间】:2012-06-11 01:44:50
【问题描述】:

这就是正在发生的事情:

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

所以我已经做了一段时间了,但并没有变得更好。

这是一个概述 (or no overview):

有四个源文件:

  • corbit.cpp(主),

  • initialization.cpp(初始化实体向量),

  • entity.cpp(实体类文件),

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

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

display.cpp 包括“entity.h”(带有#ifndef ENTITY_H 保护事物)和“display.h”,以及(例如)allegro.h

entity.cpp 包括“entity.h”

initialization.cpp 包括(同样使用#ifndef 保护)“entity.h”以及“initialization.h”

当我在 Codeblocks 中使用 GCC 进行编译时,它会打开 locale_facets.tcc(有人知道那是什么吗?)作为一个空文件。它还给了我两条错误消息,如下:

  • corbit.o 在函数“ZNSt6vectorIP10physical_tSaIS1_EE5clearEv”中

  • display.o: [项目目录]..\lib\gcc\mingw32\3.4.5........\include\c++\3.4.5\bits\locale_facets.tcc(行第2497章

  • corbit.o 在函数“ZNSt6vectorIP10physical_tSaIS1_EE5clearEv”中

  • display.o: [项目目录]..\lib\gcc\mingw32\3.4.5........\include\c++\3.4.5\bits\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、代码块、gcc。我想不出别的了。帮助将不胜感激!

【问题讨论】:

  • physical_t* 周围实际上有尖括号,但我不知道如何在堆栈溢出中执行这些操作
  • 虽然我不确定,但我的直接猜测是,从一个有效的大文件开始解决这个问题可能会更容易,而不是已经拆分但不再有效的文件您发布的文件。
  • 巧合的是,当你问这个问题时,我刚刚放弃并开始了,所以一旦我克服了这个未定义的 vtable 错误,我就会把代码准备好
  • 不管怎样,我想出了一种不使用 extern 的更简单的文件分割方法,即使它不会削减那么多行。无论如何感谢您的帮助。

标签: c++ windows gcc linker codeblocks


【解决方案1】:

是否将其他源文件包含在主源中?您不应该这样做,尤其是当您在多个源文件中包含相同的头文件时。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    相关资源
    最近更新 更多