gpt4 book ai didi

c++ - 在命名空间中包装 extern "C"库时出现问题

转载 作者:可可西里 更新时间:2023-11-01 17:39:39 25 4
gpt4 key购买 nike

我正在使用 C++ 中的 C 库 (libgretl),它的一些函数与我的代码冲突,所以我想将它包装在一个命名空间中,如下所示:

namespace libgretl {
extern "C" {
#include <gretl/libgretl.h>
}}

但是,这不会编译,我从 gcc 文件中得到“未定义”错误(在 Windows 上使用 mingw32 和 gcc 4.5.2)。第一个错误来自文件 c++/cstddef 的以下代码块:

_GLIBCXX_BEGIN_NAMESPACE(std)
using ::ptrdiff_t;
using ::size_t;
_GLIBCXX_END_NAMESPACE

其中宏分别展开为 namespace std {}。这些之后还有更多错误。

省略 extern "C" 指令没有帮助。使用匿名命名空间可减少错误数量,但仍无法编译。

因此,我的问题是,是否有某种方法可以在不更改 gcc 或库的源文件的情况下包含此类 C 库并将其函数放入命名空间?

谢谢。

米迦勒

最佳答案

你做不到。命名空间不仅仅是源代码装饰,它们还被编译器破坏为对象符号。

库中的原生 C 函数 foo() 将通过目标文件中的符号 _foo 提供,但调用 bar::foo() 将生成对例如 @N3barfoo 的引用。结果,将发生链接器错误。

您可以在单独的源文件中创建“代理”函数,仅在该源文件中包含原始库头并将所有代理函数放入命名空间。

关于c++ - 在命名空间中包装 extern "C"库时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7188069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com