我有用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