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

C++ 动态链接库问题

  •  
  •   GhostRider · 337 天前 · 1594 次点击
    这是一个创建于 337 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  337 天前
    还是决定老老实实 用 VC SDK 吧 太复杂,,自己用 C++ 封装一下
    16 回复  |  直到 2019-01-30 09:50:25 +08:00
        1
    ysc3839   337 天前
    动态库不需要转换,在 Windows 上不同编程语言是通用的。
    你指的可能是 Import Library,参见 MinGW wiki http://www.mingw.org/wiki/createimportlibraries。
        2
    ysc3839   337 天前
        3
    wwqgtxx   337 天前 via iPhone   ♥ 1
    用 vc 的 sdk 呗,把所有 c 函数都 dllexport,在你的 qt 程序中 dlopen
        4
    jorneyr   337 天前   ♥ 1
    C 的 DLL 可以跨编译器, C++ 的 DLL 不能跨编译器, 甚至同一个编译器高低版本都不一定兼容.
        5
    hilbertz   337 天前
    clang 可以链接 msvc dll
        6
    GhostRider   337 天前
    @ysc3839 链接还没看,待会看。 但是在 VS 和 QT C++ 的 dll 里 函数名称修饰规则不一样,不转换的话直接就是链接错误。
        7
    ysc3839   337 天前
    @GhostRider 是我没想到这个问题,我以为 DLL 导出的是 C API。
        8
    Nasei   337 天前 via Android
    qt 可以调用 com 吧,把 vs 的 dll 封装成 com 可行么
        9
    GeruzoniAnsasu   337 天前
    0. 如果 dll 不能动态加载来用,建议直接放弃折腾用厂商给的标准方案

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

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

    我觉得用 vc 编译一份 qt,还能自己制定缩小体积,再链上那个东西就可以了。全都在 vc 下完成。
        16
    dosmlp   319 天前
    动态库不需要转换,对于不同 c++版本的编译器,导出符号可能不同,就是不同编译器编出来的动态库很可能不能通用,但是 C 不存在这个问题,你可以用 2010 的 C 把动态库包装成 c 接口,再在其他编译器下调用
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1372 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 23:58 · PVG 07:58 · LAX 15:58 · JFK 18:58
    ♥ Do have faith in what you're doing.