【发布时间】:2013-10-25 11:33:59
【问题描述】:
gcc (GCC) 4.7.2
你好,
我正在创建一个将在 linux 上编译的共享库和一个在 windows 上使用相同源代码编译的 dll。所以我正在为 linux 和 windows 创建一个可移植的库。
在我的库头文件中是这个,即 module.h
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _WIN32
#define LIB_INTERFACE(type) EXTERN_C __declspec(dllexport) type
#else
#define LIB_INTERFACE(type) type
#endif
LIB_INTERFACE(int) module_init();
#ifdef __cplusplus
}
#endif
在源代码中,我有以下内容,即 module.c
#include "module.h"
LIB_INTERFACE(int) module_init()
{
/* do something useful
return 0;
}
在我的测试应用程序中,它将链接和使用这个模块。所以我有这个:
#include "module.h"
int main(void)
{
if(module_init() != 0) {
return -1;
}
return 0;
}
1) 我上面所做的是否是为 linux 和 windows 创建可移植库的正确实现?
2) 我只是想知道我已经将函数包装在extern "C" 中,以便可以从用 C++ 编译的程序调用这个库。我在下面还需要这个EXTERN_C吗:
#define LIB_INTERFACE(type) EXTERN_C __declspec(dllexport) type
3) EXTERN_C 的用途是什么?
非常感谢,
【问题讨论】:
-
它是一个宏,对于 C++ 编译解析为
extern "C",对于 C 编译解析为extern或无。 (老实说,我不记得是哪个,但突出显示它并按 F12,它应该带你到实际定义)。它的 目的 是指示编译器从从库中导出的符号中删除 C++ 名称修饰。不,如果您已经将整个标头包含在extern "C" {中,则可以消除它(假设 gcc 理解相同的 block-extern-C,而且我不记得是否确实如此)。 -
请阅读this。您可能想使用这种机制。
-
@ant2009 您的库是否必须从 C 中使用,或者您可以将其限制为 C++11?
标签: c++ c compatibility