假設我們使用gcc/g ++和隨機委員會指定的C API。本規範定義了功能在C++中包裝不同的C API實現
void foo(void);
現在,根據此規範有幾種實現。我們選取兩個作爲樣本,並將它們分別稱爲nfoo
和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
}
};
現在,我們正面臨着一個問題:我們如何創建(即鏈接)一切都變成一個庫?
我看到將有一個符號與C API實現的foo
函數符號衝突。
我已經嘗試到C++包裝實現分成單獨的靜態庫,但後來我意識到(再次),該靜態庫僅僅是一個未連接的對象文件的集合。所以這根本不起作用,除非有一種方法可以將C庫完全鏈接到包裝器中並移除/隱藏它們的符號。
建議非常感謝。
更新:最優的解決方案應該同時支持這兩種實現方式。
注意:該代碼並不意味着功能。感知它作爲僞代碼。
在C或C++中沒有任何東西可以幫助您實現這一點。無論如何,衝突符號都不能連接在一起。您可以動態加載這些庫,也可以用一塊大石頭錘住它們以消除衝突(有些工具可以重命名對象文件中的符號,用於* some *目標文件格式)。 –