Integrity中X.cpp / X.hpp文件的奇怪行为

时间:2010-09-15 16:21:22

标签: c++ linker greenhills

我有一个与gcc完美编译的项目,但无法在Greenhills Integrity环境下编译。

问题归结为这三个文件:

MyVector.cpp // contains function testVector
MyVector.hpp // contains template vector<>
SomeFile.cpp

MyVector.hpp包含向量的模板类,MyVector.cpp包含与MyVector.hpp模板无关的测试函数。

现在,当我在MyVector.hpp中使用vector的{​​{1}}模板时,不知何故,函数SomeFile.cpp会被注入testVector。当我在SomeFile.cpp中停止使用vector时(我当然还是SomeFile.cpp',我只是没有在那里实例化模板)它完美无缺。

此外,当我向函数#include注入警告时,编译器在编译testVector时显示警告

此外,当我在SomeFile.cpp中更改内容时,构建系统会重新编译SomeFile.cpp

当我从MyVector.cpp删除testVector功能并将其移至新MyVector.cpp时,它会进行编译。

不,我没有错误地包含NewFile.cpp文件,说实话,我仔细检查了它,cpp编了我的所有源代码。

我不知道发生了什么。我会很高兴有任何线索。

3 个答案:

答案 0 :(得分:2)

Green Hills使用Edison Design Group前端,直到最近(例如,MULTI 5.0或甚至5.2),编译器默认启用--implicit_include。这是该选项的Edison documentation

--implicit_include
--no_implicit_include
-B
     Enable or disable implicit inclusion of source files as a method of
     finding definitions of template entities to be instantiated. -B is
     equivalent to --implicit_include. The default behavior is specified
     by the configuration flag DEFAULT_IMPLICIT_TEMPLATE_INCLUSION_MODE.
     See the section of this chapter on template instantiation. This
     option is valid only in C++ mode.

如果在编译器命令行上传递--no_implicit_include,很可能会解决您的问题。 (如果失败,请尝试-W0,--no_implicit_include:compiler.args=--no_implicit_include,其中任何一个都会将选项直接传递到前端,而不会被驱动程序(很多)审查。传递--std或{{ 1}}也可能有所帮助;我不记得了。)

隐含包含是一个非常愚蠢的想法,但它是一种在90年代提供模板功能的便捷方式。今天,有一些标准和众所周知的方法来满足One Definition Rule,这种“隐含包含”黑客只会阻碍像你这样守法的C ++ tizens。

现在继续,问我关于预链接 ...:)

答案 1 :(得分:-1)

当你说'注射警告'时你使用的是#pragma指令吗?在编译期间,而不是在运行时期间,可以看到#pragma指令。

当你说'testVector函数被注入SomeFile.cpp'时,这是怎么看到的? 您是否收到编译器或链接器错误,说明该函数先前已定义过?

您是在为Integrity OS编译gcc还是为x86 Linux编译gcc? Integrity的工作方式与Linux完全不同,Integrity项目的类型很重要。您可以构建支持动态下载的单一Integrity内核或Integrity内核。此外,Integrity C和C ++运行时库与Linux不同。

答案 2 :(得分:-2)

你是如何实现矢量的?我在想你是在MyVector.cpp中实现它,并在MyVector.hpp的末尾包含MyVector.cpp。如果是这种情况,包括SomeFile.cpp中的MyVector.hpp将在您更改MyVector.cpp时触发SomeFile.cpp的重建。我建议通过预处理器运行它,看看是否包含了testVector()。