C++ 动态链接库问题

2019-01-12 15:52:08 +08:00
 GhostRider

最近做的一个项目用的相机厂家提供的驱动有 C++ SDK 和 VC SDK,但是 Windows 只支持 VS 版本。我用的确实 qt 编译器也不一样。本想自己编译,但是和开源项目不同,厂家不提供源码,也没有 Cmake 文件,他们开发就是在 VS 2010 上开发的。其他模块都弄好了就差相机,换平台好麻烦。大佬们有没有办法能把 VS 的 C++动态库 转成 QT(Mingw)的动态库呢。

3809 次点击
所在节点    C
16 条回复
ysc3839
2019-01-12 16:02:57 +08:00
动态库不需要转换,在 Windows 上不同编程语言是通用的。
你指的可能是 Import Library,参见 MinGW wiki http://www.mingw.org/wiki/createimportlibraries。
ysc3839
2019-01-12 16:03:25 +08:00
wwqgtxx
2019-01-12 16:03:48 +08:00
用 vc 的 sdk 呗,把所有 c 函数都 dllexport,在你的 qt 程序中 dlopen
jorneyr
2019-01-12 16:09:08 +08:00
C 的 DLL 可以跨编译器, C++ 的 DLL 不能跨编译器, 甚至同一个编译器高低版本都不一定兼容.
hilbertz
2019-01-12 16:12:19 +08:00
clang 可以链接 msvc dll
GhostRider
2019-01-12 16:30:56 +08:00
@ysc3839 链接还没看,待会看。 但是在 VS 和 QT C++ 的 dll 里 函数名称修饰规则不一样,不转换的话直接就是链接错误。
ysc3839
2019-01-12 16:32:03 +08:00
@GhostRider 是我没想到这个问题,我以为 DLL 导出的是 C API。
Nasei
2019-01-12 17:01:10 +08:00
qt 可以调用 com 吧,把 vs 的 dll 封装成 com 可行么
GeruzoniAnsasu
2019-01-12 17:09:56 +08:00
0. 如果 dll 不能动态加载来用,建议直接放弃折腾用厂商给的标准方案

1. 先看一眼 dll 的导出表,看命名修饰,如果都是 c style 函数,那其实挺好办,如果是 c++,如果有导出类,建议放弃折腾老老实实用厂商的标准解决方案,如果只是导出函数,也就名字长一点,封装一下就行

2. qt 一样可以直接用 windows native api 绕过 posix 那层逻辑来加载 dll/调用函数,反正调用的时候符合 dll 导出函数的约定就行
wbing
2019-01-12 18:02:05 +08:00
用 vs10,自己建一个生成 dll 的工程,把厂家的 sdk 封装了,然后导出成 C 接口的动态库,给 qt 用
FrankHB
2019-01-12 18:13:44 +08:00
啥厂商产品那么衰,给个准儿加名单吧。
cjw1115
2019-01-12 22:36:27 +08:00
用 C 做一个 wrapper 吧
GhostRider
2019-01-12 23:05:38 +08:00
@GeruzoniAnsasu 果然是大佬,决定还是用 VC SDK 吧 不折腾了,,
GhostRider
2019-01-12 23:06:14 +08:00
@cjw1115 嗯嗯
thedrwu
2019-01-13 01:51:40 +08:00
c 的部分可以随便换编译器。c++如果导出 class 就需要同一个 runtime 库,即使交叉使用同一版本的 debug 和 release runtime 都不行。

我觉得用 vc 编译一份 qt,还能自己制定缩小体积,再链上那个东西就可以了。全都在 vc 下完成。
dosmlp
2019-01-30 09:50:25 +08:00
动态库不需要转换,对于不同 c++版本的编译器,导出符号可能不同,就是不同编译器编出来的动态库很可能不能通用,但是 C 不存在这个问题,你可以用 2010 的 C 把动态库包装成 c 接口,再在其他编译器下调用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/526360

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX