【发布时间】:2014-09-08 11:45:11
【问题描述】:
我有一个用 C++ 编写的共享库,它也为用 C++ 编写的不同应用程序提供了一些 API 调用,现在我想在 C 程序中使用这个库。原始库包含仅对 C++ 有效的数据类型,例如 std::string 和 std::vector 如下:
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 调用的函数。
-
为什么要用两种语言编写它?您可以创建一个 C 库并为其编写 C++ 绑定,或者编写一个 C++ 库并为其编写 C 绑定。然后将该库与您的应用程序链接,瞧。
-
DLL 的导出函数和数据类型应为 C 风格。
标签: c++ c boost shared-memory