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
的目的是什么?
提前感谢。
extern "C"
,在C编译时则展开为extern
或什么也不展开(我记不清了,但可以将其选中并按F12查看实际定义)。它的目的是指示编译器从您的库导出的符号中删除C++名称修饰。如果您已经将整个头文件包装在extern "C" {
中,则无需添加该宏(假设gcc理解相同的块级别extern C,但我不确定)。 - WhozCraig