在 .dll 中使用 typedef void*
Using typedef void* within a .dll
我尝试从 Verialtor 源代码制作一个 .dll,因为他们已经实现了这种可能性。
他们使用通用处理程序typedef void* svScope
初始化作用域。 .dll 也使用这个句柄。
现在我可以使用
创建新函数
__declspec(dllexport) svScope svGetScope( void );
这是 header 代码 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 个退出状态
您需要在函数声明中使用 XXTERN
。您没有向我们展示任何包含必须导出的函数的实际源代码,但让我们想象一下:
svScope foo();
这个函数会return一个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();
我尝试从 Verialtor 源代码制作一个 .dll,因为他们已经实现了这种可能性。
他们使用通用处理程序typedef void* svScope
初始化作用域。 .dll 也使用这个句柄。
现在我可以使用
__declspec(dllexport) svScope svGetScope( void );
这是 header 代码 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 个退出状态
您需要在函数声明中使用 XXTERN
。您没有向我们展示任何包含必须导出的函数的实际源代码,但让我们想象一下:
svScope foo();
这个函数会return一个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();