Integrity 中 X.cpp/X.hpp 文件的奇怪行为
我有一个可以使用 gcc
完美编译的项目,但无法在 Greenhills Integrity 环境下编译。
问题归结为这三个文件:
MyVector.cpp // contains function testVector
MyVector.hpp // contains template vector<>
SomeFile.cpp
MyVector.hpp
包含向量的模板类,MyVector.cpp
包含与 MyVector.hpp 无关的测试函数
的模板。
现在,当我在 SomeFile.cpp
中使用 MyVector.hpp
的 vector
模板时,不知何故,函数 testVector 被注入到
SomeFile.cpp
中。当我停止在 SomeFile.cpp
中使用 vector
时(当然我仍然在#include
'ing它,我只是没有实例化那里的模板)它工作得很好。
此外,当我向函数testVector
注入警告时,编译器在编译SomeFile.cpp
时显示警告!
而且,构建系统重新编译< code>SomeFile.cpp 当我更改 MyVector.cpp
中的内容时。
当我从 MyVector.cpp
中删除 testVector
函数并将其移动到新的 NewFile.cpp
时 - 它会编译。
不,我没有错误地包含 cpp
文件,老实说,我仔细检查了它,并 grep
编辑了我的所有源代码。
我不知道发生了什么事。我会很高兴有任何线索。
I'm having a project which compiles perfectly with gcc
, but fails to compile under Greenhills Integrity environment.
The problem boils down to this three files:
MyVector.cpp // contains function testVector
MyVector.hpp // contains template vector<>
SomeFile.cpp
MyVector.hpp
contains template-class for a vector, and MyVector.cpp
contains a testing function unrelated to MyVector.hpp
's templates.
Now, when I'm using MyVector.hpp
's vector
templates in SomeFile.cpp
, somehow, the function testVector
gets injected into SomeFile.cpp
. When I cease to use vector
in SomeFile.cpp
(I'm still #include
'ing it of course, I'm just not instantiate the template there) it works perfectly.
Moreover when I injected a warning into function testVector
, the compiler showed the warning when I compiled SomeFile.cpp
!
Moreover, the build system recompiles SomeFile.cpp
when I'm changing things in MyVector.cpp
.
When I'm deleting the testVector
function from MyVector.cpp
and move it to a new NewFile.cpp
- it compiles.
No, I didn't include the cpp
file by mistake, honest, I double checked it, and grep
ed all my source code.
I have no idea what's going on. I'll be glad for any clue.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Green Hills 使用 Edison Design Group 前端,直到最近(例如,MULTI 5.0 甚至 5.2),编译器默认打开
--implicit_include
。这是该选项的Edison 文档:如果您通过< code>--no_implicit_include 在编译器命令行上。 (如果失败,请尝试
-W0,--no_implicit_include
或:compiler.args=--no_implicit_include
,其中任何一个都会将选项直接传递到前端没有(太多)驱动程序的审查。通过--std
或--STD
也可能有帮助;我不记得了。)隐式包含在今天是一个非常愚蠢的想法。 ,但这是 90 年代提供模板功能的便捷方式。如今,有一些标准且众所周知的方法可以满足单一定义规则,并且这种“隐式” “包容性”黑客只会妨碍像您这样守法的 C++ 公民。
现在继续,询问我关于预链接的问题... :)
Green Hills uses the Edison Design Group front-end, and until very recently (say, MULTI 5.0 or maybe even 5.2) the compiler turned on
--implicit_include
by default. Here's the Edison documentation for that option:Your problem will very likely be fixed if you pass
--no_implicit_include
on the compiler command line. (If that fails, try-W0,--no_implicit_include
or:compiler.args=--no_implicit_include
, either of which will pass the option straight through to the front-end without (much) censorship by the driver. Passing--std
or--STD
might also help; I don't remember.)Implicit inclusion is a terribly stupid idea today, but it was a convenient way to provide template functionality back in the '90s. Today, there are standard and well-known ways of satisfying the One Definition Rule, and this "implicit inclusion" hack just gets in the way of law-abiding C++tizens such as yourself.
Now go on, ask me about prelinking... :)
当您说“注入警告”时,您是否使用了#pragma 指令?
#pragma
指令应该在编译时而不是运行时看到。当您说函数“testVector 被注入到
SomeFile.cpp
”时,这是如何观察到的?您是否收到编译器或链接器错误,指出该函数是先前定义的?
您正在为 Integrity OS 编译 gcc 还是为 x86 Linux 编译 gcc?
Integrity 的工作方式与 Linux 非常不同,并且 Integrity 项目的类型很重要。您可以构建整体 Integrity 内核或支持动态下载的 Integrity 内核。此外,Integrity C 和 C++ 运行时库与 Linux 不同。
When you say you 'inject a warning' are you using a
#pragma
directive? A#pragma
directive is meant to be seen during compile time, not during run time.When you say the function 'testVector gets injected into
SomeFile.cpp
', how is this observed?Do you get a compiler or linker error saying that the function was previously defined?
Are you compiling gcc for Integrity OS or gcc for x86 Linux?
Integrity works very differently from Linux, and the type of Integrity project matters. You can build a monolithic Integrity kernel or an Integrity kernel supporting dynamic download. Additionally the Integrity C and C++ runtime libraries are different from Linux.
你是如何实现矢量的?我认为您正在 MyVector.cpp 中实现此功能,并在 MyVector.hpp 末尾包含 MyVector.cpp 。如果是这种情况,当您更改 MyVector.cpp 时,将 MyVector.hpp 包含在 SomeFile.cpp 中将触发 SomeFile.cpp 的重建。我建议通过预处理器运行它并查看 testVector() 是从哪里包含的。
How are you implementing vector? I'm thinking you're implementing this in MyVector.cpp and including MyVector.cpp at the end of MyVector.hpp. If this is the case, including MyVector.hpp in SomeFile.cpp will trigger a rebuild of SomeFile.cpp when you change MyVector.cpp. I'd suggest run it through the pre-processor and see where the testVector() is being included from.