关于Windows上DLL导出/导入和外部的问题

iQ.*_*iQ. 5 c++ dll shared-libraries

嘿家伙我在windows dll上有一些快速的问题.

基本上我使用ifdef来处理dllexport和dllimport,我的问题实际上是关于dllexports和dllimports以及extern关键字的位置.

我将dllimports/dllexports放在头文件上,但是我必须将dllexport和dllimports放在实际定义上吗?

对于typedef怎么样?

我把dllimport/dllexport放在前面吗?如在

dllexport typedef map<string, int> st_map
Run Code Online (Sandbox Code Playgroud)

另外关于extern关键字,我看到它的使用方式如下:

extern "C" {

dllexport void func1();

}
Run Code Online (Sandbox Code Playgroud)

我也看到它被这样使用:

extern dllexport func1();
Run Code Online (Sandbox Code Playgroud)

一个包括"C"而另一个没有,我的问题是有什么区别,我需要使用它吗?如果我这样做,那么我将它用于dllexport和dllimport我是否必须在头文件声明和定义上使用它?

我的项目将是共享库,它包含我要导出的几个类文件,我想要导出的一些typdef和一些全局函数,我也想将它们全部导出到一个dll中.

有人赐教我吗?

编辑:

好吧,我想我会发布一些我已经完成的小提取物,还注意到我正在为linux和windows构建库,所以我做了一个检查:

mydll.h

#ifdef WINDOWS
#   ifdef PSTRUCT_EXPORT
#   define WINLIB __declspec(dllexport)
#   else
#   define WINLIB __declspec(dllimport)
#   endif
#else
#  define WINLIB
#endif

WINLIB void funct1();
Run Code Online (Sandbox Code Playgroud)

现在在源代码中:

mydll.cpp

#define PSTRUCT_EXPORT

void funct1() <---- do i need to add WINLIB in front of it? 
                      Or is doing it in the header enough?
Run Code Online (Sandbox Code Playgroud)

Gra*_*row 8

首先,您不需要导入或导出typedef.只要他们在双方使用的头文件中,你就会很好.您需要导入/导出函数和类定义.

大概你对导入和导出代码使用相同的头文件,所以你可以做一些makefile魔术来定义每一面的预处理器宏,然后做这样的事情:

#if defined( LIBRARY_CODE )
#define MYAPI __declspec(dllexport)
#else
#define MYAPI __declspec(dllimport)
#endif

extern MYAPI void func1();
class MYAPI MyClass {
    ...
};
Run Code Online (Sandbox Code Playgroud)

关于C与C++函数,您可以这样做:

#if defined( __cplusplus__ ) // always defined by C++ compilers, never by C
#define _croutine "C"
#else
#define _croutine
#endif

extern _croutine void function_with_c_linkage();
Run Code Online (Sandbox Code Playgroud)

确保从C++源文件(包含此函数的实现)导入此头文件,否则编译器将不知道为其提供C链接.