gpt4 book ai didi

c++ - Windows 上 DLL Exporting/Importing 和 Extern 的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:14 26 4
gpt4 key购买 nike

我有一些关于 Windows dll 的快速问题。

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

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

对于 typedef 呢?

我是否将 dllimport/dllexport 放在前面?如

dllexport typedef map<string, int> st_map

另外关于 extern 关键字,我看到它被这样使用:

extern "C" {

dllexport void func1();

}

我也看到它被这样使用:

extern dllexport func1();

一个包含“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();

现在在源代码中:

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?

最佳答案

首先,您不需要导入或导出 typedef。只要它们在双方使用的头文件中,就可以了。您确实需要导入/导出函数和类定义。

大概您对导入和导出代码使用相同的头文件,因此您可以做一些 makefile 魔术来在每一侧定义预处理器宏,然后执行如下操作:

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

extern MYAPI void func1();
class MYAPI MyClass {
...
};

关于 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();

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

关于c++ - Windows 上 DLL Exporting/Importing 和 Extern 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1440901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com