【问题标题】:Referencing C++ library function causes a task to behave incorrectly引用 C++ 库函数会导致任务行为不正确
【发布时间】:2011-11-26 06:33:33
【问题描述】:

我有一个包含 C 文件、C 库和 C++ 库的内核项目。

当项目的构建使得主文件 (.c) 引用了其中一个 C++ 库中的任何函数时,正在运行的系统会以某种方式损坏,即其中一项任务使 CPU 达到 100% 并且永不放弃。

所有任务都运行良好(无暂停、无暂停、无异常),但该任务通过分配 CPU 阻塞了整个系统。

那个C++库函数被正确调用,可以断点等调试。

链接的时候好像有副作用。

即使该 C++ 库函数只是被引用,甚至没有被调用,也会出现问题。

在使用其他 C++ 库时没有这样的问题。

您如何解释这一点以及我应该关注哪些方面?

【问题讨论】:

  • 可以在valgrind下运行吗?
  • 嗯.. 我听到 valgrind 对你说谢谢。 valgrind.org 我的平台是 INTEGRITY OS 和 PPC-32 (mpc8260),valgrind 似乎不支持。我很抱歉无法使用它。

标签: c++ linker reference task


【解决方案1】:

您的 C++ 库是否使用 extern "C" 构造声明其功能?请参阅此常见问题解答:

(32.6) How can I create a C++ function f(int,char,float) that is callable by my C code?

如果您希望 C 和 C++ 都可以使用相同的 C API 头文件,可以使用以下常见技巧:

#ifdef __cplusplus
extern "C"
{
#endif


// Function prototypes


#ifdef __cplusplus
} // Closes the extern "C" brace
#endif

内核中没有 C++ 运行时支持。 newdelete 之类的东西和异常都不起作用。有关将 C++ 代码移植到内核的提示,请参阅此博客 article

【讨论】:

  • 您好,对于那些被 C 函数调用的 C++ 函数,是的,它们被声明为 extern "C"。
  • extern "C" 是在同时使用 C/C++ 时避免名称混淆所必需的。但是,请注意,我的问题与更深层次的问题有关。我可以调用/用户/调试 C 函数调用的 C++ 库函数。没问题。观察到副作用,即在执行此链接后,任务由于某种原因出现故障。
  • 用您可能已经知道的更多内容更新了我的答案。 :-)
  • 你的 C++ 代码中有静态对象吗?在您的程序运行之前,内核无法构建它们。
  • 如果那个 C++ 库代码中有这样的静态对象,它可能是造成这种奇怪行为的原因吗?
猜你喜欢
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2017-09-18
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2021-10-26
相关资源
最近更新 更多