兼容Windows和Linux的C++动态链接库模板

发布于:2017-10-10 | 分类:python/vba/cpp


关键点

  • Windows下可以使用__declspec()修饰类的导出和导入,使用__stdcall修饰导出函数

  • Linux平台无需指定导入导出类时无需指定以上修饰名称

  • 考虑到C++的Name Mangling,可以使用extern "C" {...}修饰需要导出的函数

模板

// interface.h
# ifndef INTERFACE_H
# define INTERFACE_H
# ifdef _WIN32
#     ifdef INTERFACE_LIB
#          define INTERFACE_EXPORT __declspec(dllexport)
#     else
#          define INTERFACE_EXPORT __declspec(dllimport)
#     endif
#     define INTERFACE_EXPORT_C __stdcall
# endif

# ifdef linux
#     define INTERFACE_EXPORT
#     define INTERFACE_EXPORT_C
# endif

// exported class
class INTERFACE_EXPORT FOO{ ... };

// exported functions
extern "C" {
    void INTERFACE_EXPORT_C bar();
}

# endif
```

```
// interface.cpp
# define INTERFACE_LIB
# include "interface.h"

// exported class
FOO::FOO() { ... }
void FOO::foo() { ... }

// exported functions
void INTERFACE_EXPORT_C bar() { ... }