我有用C++編寫的共享庫,它提供了用C++編寫的不同應用程序的一些API調用,現在我想在C程序中使用這個庫。原始庫包含數據類型僅適用於C++等的std :: string和std ::矢量如下:將C程序鏈接到C++共享庫
typedef u_int32_t ApplicationID;
typedef std::string IPAddress;
typedef std::vector<int> SDLIST;
這些數據類型被用作輸入參數的API的:
register_client(IPAddress ip);
export(ApplicationID id, SDLIST *list);
但在C,我們沒有串也不矢量和這兩個數據類型應修改如下:
typedef char* IPAddress;
typedef int* SDLIST;
我試着做下面的變化在我的代碼:
typedef u_int32_t ApplicationID;
enter code here
#ifdef __cplusplus
typedef std::string IPAddress;
typedef std::vector<int> SDLIST;
#else
typedef char* IPAddress;
typedef int* SDLIST;
#endif
#ifdef __cplusplus
extern "C" {
#endif
register_client(IPAddress ip);
export(ApplicationID id, SDLIST *list);
#ifdef __cplusplus
}
#endif
我的問題是:
這是建立可以在C & C++中使用的庫以正確的方式?
我的共享庫使用Boost Interprocess庫,它是標準POSIX共享內存調用的包裝。每當我嘗試將此共享庫鏈接到任何應用程序時,我都應該在應用程序中再次包含
lrt
。所以我的問題是,可以將共享庫靜態鏈接到lrt
庫,而無需在所有使用我的共享庫的應用程序中包含lrt
?
除非你也用C編譯庫,否則包含的頭文件和底層定義將不匹配。相反,將接口更改爲僅可C調用,或者添加一個新的頭文件和函數,用於「包裝」C++代碼並且是可C調用的。 – crashmstr
你爲什麼要用兩種語言寫它?您可以創建一個C庫併爲其編寫C++綁定,或者編寫一個C++庫併爲其編寫C綁定。然後將該圖書館與您的應用程序連接起來,然後瞧。 – maxdev
DLL的導出函數和數據類型應該使用C風格。 – Yuan