VC如何创建C编译器能使用的动态库
方法
- 使用extern "C"修饰
- 设置统一的调用约定
举例
-
例1——使用
__cdecl
,一般C编译器使用此约定,如LabWidnows/CVI。- cpp代码
lib里导出的符号extern "C" __declspec(dllexport) uint32 __cdecl glFindDevices(uint32* devCnt);
__imp__glOpenDevice _glOpenDevice
- cpp代码
-
例2,实际VC默认使用
__stdcall
。-
cpp代码
extern "C" __declspec(dllexport) uint32 glFindDevices(uint32* devCnt);
lib里导出的符号
imp__glOpenDevice@8 _glOpenDevice@8
-
-
VC项目属性里可以设置默认的调用约定:[C/C++].[高级].[调用约定]。
结论
- 如果使用
lib
文件静态链接dll
文件,要保证调用约定和编译器是一致的,否则会因为“找不到外部符号”导致链接失败。 - 不推荐使用
DEF文件
导出函数名称,可能会导致C链接器找不到符号。 - 推荐使用
__declspec(dllexport)
和__declspec(dllexport)
导出导入符号。
参考
posted on 2022-12-17 13:11 OctoberKey 阅读(58) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现