V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
GhostRider
V2EX  ›  C

C++ 动态链接库问题

  •  
  •   GhostRider · 2019-01-12 15:52:08 +08:00 · 3766 次点击
    这是一个创建于 2135 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2019-01-12 23:07:42 +08:00
    还是决定老老实实 用 VC SDK 吧 太复杂,,自己用 C++ 封装一下
    16 条回复    2019-01-30 09:50:25 +08:00
    ysc3839
        1
    ysc3839  
       2019-01-12 16:02:57 +08:00
    动态库不需要转换,在 Windows 上不同编程语言是通用的。
    你指的可能是 Import Library,参见 MinGW wiki http://www.mingw.org/wiki/createimportlibraries。
    ysc3839
        2
    ysc3839  
       2019-01-12 16:03:25 +08:00
    wwqgtxx
        3
    wwqgtxx  
       2019-01-12 16:03:48 +08:00 via iPhone   ❤️ 1
    用 vc 的 sdk 呗,把所有 c 函数都 dllexport,在你的 qt 程序中 dlopen
    jorneyr
        4
    jorneyr  
       2019-01-12 16:09:08 +08:00   ❤️ 1
    C 的 DLL 可以跨编译器, C++ 的 DLL 不能跨编译器, 甚至同一个编译器高低版本都不一定兼容.
    hilbertz
        5
    hilbertz  
       2019-01-12 16:12:19 +08:00
    clang 可以链接 msvc dll
    GhostRider
        6
    GhostRider  
    OP
       2019-01-12 16:30:56 +08:00
    @ysc3839 链接还没看,待会看。 但是在 VS 和 QT C++ 的 dll 里 函数名称修饰规则不一样,不转换的话直接就是链接错误。
    ysc3839
        7
    ysc3839  
       2019-01-12 16:32:03 +08:00
    @GhostRider 是我没想到这个问题,我以为 DLL 导出的是 C API。
    Nasei
        8
    Nasei  
       2019-01-12 17:01:10 +08:00 via Android
    qt 可以调用 com 吧,把 vs 的 dll 封装成 com 可行么
    GeruzoniAnsasu
        9
    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
        10
    wbing  
       2019-01-12 18:02:05 +08:00 via iPhone
    用 vs10,自己建一个生成 dll 的工程,把厂家的 sdk 封装了,然后导出成 C 接口的动态库,给 qt 用
    FrankHB
        11
    FrankHB  
       2019-01-12 18:13:44 +08:00
    啥厂商产品那么衰,给个准儿加名单吧。
    cjw1115
        12
    cjw1115  
       2019-01-12 22:36:27 +08:00
    用 C 做一个 wrapper 吧
    GhostRider
        13
    GhostRider  
    OP
       2019-01-12 23:05:38 +08:00
    @GeruzoniAnsasu 果然是大佬,决定还是用 VC SDK 吧 不折腾了,,
    GhostRider
        14
    GhostRider  
    OP
       2019-01-12 23:06:14 +08:00
    @cjw1115 嗯嗯
    thedrwu
        15
    thedrwu  
       2019-01-13 01:51:40 +08:00 via Android
    c 的部分可以随便换编译器。c++如果导出 class 就需要同一个 runtime 库,即使交叉使用同一版本的 debug 和 release runtime 都不行。

    我觉得用 vc 编译一份 qt,还能自己制定缩小体积,再链上那个东西就可以了。全都在 vc 下完成。
    dosmlp
        16
    dosmlp  
       2019-01-30 09:50:25 +08:00
    动态库不需要转换,对于不同 c++版本的编译器,导出符号可能不同,就是不同编译器编出来的动态库很可能不能通用,但是 C 不存在这个问题,你可以用 2010 的 C 把动态库包装成 c 接口,再在其他编译器下调用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3004 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:15 · PVG 08:15 · LAX 16:15 · JFK 19:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.