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)
首先,您不需要导入或导出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链接.