【发布时间】:2012-06-10 17:44:41
【问题描述】:
我正在使用特定的工具链(BlackBerry Playbook NDK 附带的工具链)。我认为它基于 GCC 4.4.2。当我尝试使用这个工具链编译某些库时,我遇到了一些奇怪的问题,我认为是 c++ 全局命名空间的东西。例如,我会收到如下错误:
'::sprintf' has not been declared
在链接 GNU c++ 标准库时,我从来没有遇到这些错误。但是,Playbook NDK 默认使用 Dinkumware C++ 库,我总是必须检查每个错误并通常添加 C 等效项(在本例中为 stdio.h)。由于我无法控制的原因,我无法链接到没有出现任何这些问题的 GNU c++ 标准库。
如果我试图编译一个更大的项目,我可能会遇到数百个这样的错误。是否有不涉及编辑源的解决方法?在上面的示例中,该文件通常包含“cstdio”作为头文件,但它在“std”命名空间下声明了 sprintf。所以我唯一的选择是包含 C 标头或添加 std 命名空间。
【问题讨论】:
-
你应该添加
<cstdio>而不是stdio.h -
抱歉,我编辑了我的帖子以反映发生的情况。源文件通常包含 cstdio。但它会抛出一个错误,除非我在 std 命名空间下添加函数调用。
-
他的问题是
<cstdio>声明了std命名空间下的所有内容。他正在使用<stdio.h>来解决这个问题,并想知道是否有其他方法。我认为没有,除了用std或using namespace std;作为前缀。 -
使用 GNU STL 并不能解决这个问题。
-
对我有用。需要明确的是,我正在尝试使用这个特定的工具链移植项目。如果我尝试用我的台式机编译相同的项目,我不会有任何问题,它会正常工作。但是同一个项目不会用工具链编译。此外,如果我强制工具链使用 g++ 驱动程序而不是其默认的 qcc 驱动程序,则一切编译正常。两者之间的区别是 qcc 驱动程序链接针对 Dinkumware 库和 g++ 链接针对 GNU stl。我不知道这两种方法之间有什么其他区别。
标签: c++ global-namespace