在 .dll 中使用 typedef void*

Posted

技术标签:

【中文标题】在 .dll 中使用 typedef void*【英文标题】:Using typedef void* within a .dll 【发布时间】:2021-03-11 09:43:30 【问题描述】:

我尝试从 Verialtor 源代码制作一个 .dll,因为他们已经实现了这种可能性。

他们使用通用处理程序typedef void* svScope 初始化范围。 .dll 也使用此句柄。 现在我可以使用

创建新功能了

__declspec(dllexport) svScope svGetScope( void );

这是头代码 svdpi.h

#ifndef INCLUDED_SVDPI
#define INCLUDED_SVDPI

#include <stdint.h>

#ifdef __cplusplus
extern "C" 
#endif

__declspec(dllexport) typedef void* svScope;

__declspec(dllexport) svScope svGetScope( void );

#ifdef __cplusplus

#endif
#endif

还有一个简单的实现svdpi.cpp

#include "svdpi.h"

svScope svGetScope() return 0;

我已经创建了测试文件 test.cpp

#include <stdlib.h>
#include <stdio.h>
#include "svdpi.h"

int main()

    svScope Scope = svGetScope();

我编译了库并链接了它。编译器找到了库,但我得到了这个错误

g++ -o test.exe -s test.o -L。 -lsvdpi

c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: test.o:test.cpp :(.text+0xf): 未定义的对 `_imp__svGetScope' 的引用 collect2.exe:错误:ld 返回 1 个退出状态

【问题讨论】:

Typedefs 仅在源代码中有意义,一旦编译,它们甚至不存在于二进制文件中(我相信) 是的,但它忽略了 dll 属性,因此当我构建我的程序时,函数是未定义的。 函数的声明是否标有 dll 属性?因为它不会从 typedef 传递给函数,即使函数使用 typedef。 声明如下: __declspec(dllexport) typedef void* svScope; 【参考方案1】:

您需要在函数声明上使用XXTERN。您没有向我们展示任何包含必须导出的函数的实际源代码,但让我们想象一下:

svScope foo();

这个函数将返回一个svScope,它只是一个void *。如果您希望将其导出,则必须使用__declspec(export) 标记它(或者,在您的情况下为XXTERN

XXTERN svScope foo();

见Exporting from a DLL Using __declspec(dllexport)。

编辑:编辑问题后。

在您需要的 DLL 中:

__declspec(dllexport) svScope foo();

并且在使用您需要的 DLL 的应用程序中:

__declspec(dllimport) svScope foo();

【讨论】:

是的,这是真的XXTERN svScope svGetScope(void); 这就是我获得对`_imp__svGetScope的未定义引用的函数 确实,我根本没有给你看任何有意义的代码.. .dll 也被编译器识别和链接,所以我不知道我做错了什么...... 您应该编辑您的问题并提供minimal reproducible example。您得到的实际错误也会有所帮助。

以上是关于在 .dll 中使用 typedef void*的主要内容,如果未能解决你的问题,请参考以下文章

STM32bootload——typedef void (*Fun) (void) 理解

怎么获取dll中的函数地址

C++ typedef struct 等效于 C#

typedef void far *LPVOID 的具体定义

“typedef void (^Something)()”是啥意思[重复]

“typedef void (*Something)()”是啥意思