我有一个与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
编了我的所有源代码。
我不知道发生了什么。我会很高兴有任何线索。
答案 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()。