生成 dll 文件时的函数名字问题

GetProcAddress
dll 文件中函数名字规则 写道
extern "C" :用于.cpp文件声明不改编

_stdcall :add变为:_add@8
               :add不变

cpp文件没有声明extern "C"
_stdcall :add变为:?add@@YGHHH@Z
               :add变为:?add@@YAHHH@Z


调用:
HINSTANCE hInst;

// hInst=LoadLibrary("lib.dll");
// hInst=LoadLibrary("mylib.dll"); 
hInst=LoadLibrary("mylib1.dll");

// typedef int ( _stdcall *ADDPROC)(int a, int b);
// typedef int ( _stdcall *ADDPROC)(int a, int b); 
typedef int ( *ADDPROC)(int a, int b);

// ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"_add@8");
// ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"_Java_com_ldq_ExJNI_add@16");
ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"?add@@YAHHH@Z");

// ADDPROC Add=(ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1));
k=Add(i,j);


代码:lib1.c
_declspec (dllexport) int _stdcall add(int i, int j)
{
return i+j;
}
命令:cl /LD lib1.c
生成:lib1.dll
命令:dumpbin -exports lib1.dll
函数名:_add@8

代码:lib2.c
_declspec (dllexport) int add(int i, int j)
{
return i+j;
}
命令:cl /LD lib2.c
生成:lib2.dll
命令:dumpbin -exports lib2.dll
函数名:add

代码:lib1.cpp
_declspec (dllexport) int _stdcall add(int i, int j)
{
return i+j;
}
命令:cl /LD lib1.cpp
生成:lib1.dll
命令:dumpbin -exports lib1.dll
函数名:?add@@YGHHH@Z

代码:lib2.cpp
_declspec (dllexport) int add(int i, int j)
{
return i+j;
}
命令:cl /LD lib2.cpp
生成:lib2.dll
命令:dumpbin -exports lib2.dll
函数名:?add@@YAHHH@Z

代码:lib3.cpp
extern "C" _declspec (dllexport) int _stdcall add(int i, int j)
{
return i+j;
}
命令:cl /LD lib3.cpp
生成:lib3.dll
命令:dumpbin -exports lib3.dll
函数名:_add@8

代码:lib4.cpp
extern "C" _declspec (dllexport) int add(int i, int j)
{
return i+j;
}
命令:cl /LD lib4.cpp
生成:lib4.dll
命令:dumpbin -exports lib4.dll
函数名:add

 

Visual Studio 2019 生成 DLL 函数生成 DLL 文件和 `.lib` 文件,可能有以下原因及相应解决办法: #### 项目配置问题 - **输出目录设置错误**:检查项目属性中的输出目录设置。路径可能被错误配置,导致生成文件被保存到了非预期的位置。可在“解决方案资源管理器”中右键点击项目,选择“属性”,在“配置属性” -> “常规” -> “输出目录”中确认路径是否正确。 - **配置管理器设置错误**:确认“配置管理器”中的平台和配置设置是否正确。若选择了错误的平台(如 x86 与 x64 不匹配)或配置(如 Debug 与 Release 选择错误),可能导致生成失败。 #### 代码问题 - **编译错误**:代码中存在语法错误、缺少头文件包含或库引用等问题,会导致编译失败,从而无法生成 DLL 和 `.lib` 文件。查看“错误列表”窗口,根据提示修复代码中的错误。例如,若缺少必要的头文件包含,添加相应的 `#include` 语句: ```cpp #include <iostream> ``` - **入口点问题**:DLL 项目通常不需要 `main` 函数,但可能需要 `DllMain` 函数作为入口点。若缺少该函数,可能会导致生成失败。可添加 `DllMain` 函数示例: ```cpp BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } ``` #### 权限问题 - **文件权限不足**:若项目所在目录或输出目录没有足够的写入权限,将无法生成文件。确保以管理员身份运行 Visual Studio,或检查目录的权限设置。 #### 依赖项问题 - **缺少必要的库文件**:项目依赖的库文件缺失或路径配置错误,会导致链接失败。检查项目属性中的“链接器” -> “常规” -> “附加库目录”和“链接器” -> “输入” -> “附加依赖项”,确保库文件路径和名称正确。例如,若使用了 OpenCV 库,添加相应的库路径和名称: ```plaintext D:\opencv\build\x64\vc16\lib opencv_world455.lib ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值