在 .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) 理解
typedef void far *LPVOID 的具体定义