马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在 Cygwin 环境下链接 VC++ 生成的 DLL 库需解决符号导特别式和调用约定的兼容性问题,以下是具体操作步骤:
一、VC++ 生成 DLL 的设置要点
- 声明 C 风格导出函数
在 VC++ 中利用 extern "C" 和 __declspec(dllexport) 避免 C++ 名称修饰,并显式指定调用约定(如 __stdcall):
- extern "C" __declspec(dllexport) int __stdcall Add(int a, int b);
复制代码 此操作确保导出的符号名称与 Cygwin 兼容。
- 生成 DEF 文件(可选)
若需手动控制导出符号,可在 VC++ 项目中添加 .def 文件,明白列出函数名和序号。
二、生成 Cygwin 兼容的导入库
- 导出 DLL 的 DEF 文件
利用 pexports 工具从 VC++ 生成的 DLL 中提取 DEF 文件(推荐):
- pexports vc_dll.dll > vc_dll.def
复制代码 或通过 dumpbin /exports vc_dll.dll 导出后手动清算格式38。
- 转换为 Cygwin 的 .a 导入库
执行 dlltool 生成 GCC 可链接的静态库:
- dlltool -D vc_dll.dll -d vc_dll.def -l libvc_dll.a -k
复制代码 -k 参数自动修正 __stdcall 调用约定的符号名(如 _Add@8 → Add)。
三、在 Cygwin 中链接与调用
- 编译时链接导入库
在 GCC 命令中指定导入库路径和库名:
- gcc main.c -L. -lvc_dll -o main.exe
复制代码 -L. 指定库路径,-lvc_dll 对应 libvc_dll.a34。
- 运行时依靠处置处罚
- 将 vc_dll.dll 放置在可执行文件同级目录或系统 PATH 路径中。
- 若 DLL 依靠 Cygwin 环境(如调用 cygwin1.dll 的 API),需在代码中初始化 Cygwin 运行时: HMODULE h = LoadLibrary("cygwin1.dll");
void (*init)() = GetProcAddress(h, "cygwin_dll_init");
init();
此代码确保 Cygwin 运行时正确加载12。
四、常见问题与解决
- 符号未找到(Undefined reference)
查抄 DEF 文件中的函数名是否与导出名一致,比方 __stdcall 函数可能被修饰为 _Add@8,需通过 dlltool -k 或手动修正名称。
- 内存访问辩论
确保 VC++ 和 Cygwin 利用相同运行时库(如均选择动态链接 CRT),避免跨模块内存分配与开释16。
- C++ 类方法不可用
C++ 类方法因名称修饰(Name Mangling)无法跨编译器调用,发起改用 C 风格接口或通过纯虚接口类封装。
通过上述步骤,可实现 Cygwin 对 VC++ 编译的 DLL 的调用,核心在于符号导特别式的统一和调用约定的兼容性处置处罚。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |