假设我们使用的是 gcc/g++ 和一个随机委员会指定的 C API。本规范定义了功能
void foo(void);
现在,根据本规范有几种实现方式。让我们选择两个作为示例并将它们称为nfoo
and xfoo
(由 libnfoo 和 libxfoo 分别作为静态和动态库提供)。
现在,我们要为foo
-API 创建一个 C++ 框架。因此,我们指定一个抽象类
class Foo
{
public:
virtual void foo(void) = 0;
};
和相应的实现
#include <nfoo.h>
#include "Foo.h"
class NFoo : public Foo
{
public:
virtual void foo(void)
{
::foo(); // calling foo from the nfoo C-API
}
};
也
#include <xfoo.h>
#include "Foo.h"
class XFoo : public Foo
{
public:
virtual void foo(void)
{
::foo(); // calling foo from the xfoo C-API
}
};
现在,我们面临一个问题:我们如何将所有内容创建(即链接)到一个库中?
我看到将与foo
C API 实现的函数符号发生符号冲突。
我已经尝试将 C++ 包装器实现拆分为单独的静态库,但后来我(再次)意识到静态库只是未链接目标文件的集合。所以这根本行不通,除非有办法将 C 库完全链接到包装器中并删除/隐藏它们的符号。
建议高度赞赏。
更新:最佳解决方案应同时支持这两种实现。
注意:代码并不意味着可以正常工作。将其视为伪代码。