C++ 动态链接库问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
GhostRider
V2EX    C

C++ 动态链接库问题

  •  
  •   GhostRider Jan 12, 2019 4483 views
    This topic created in 2661 days ago, the information mentioned may be changed or developed.

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

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

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

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

    我觉得用 vc 编译一份 qt,还能自己制定缩小体积,再链上那个东西就可以了。全都在 vc 下完成。
    dosmlp
        16
    dosmlp  
       Jan 30, 2019
    动态库不需要转换,对于不同 c++版本的编译器,导出符号可能不同,就是不同编译器编出来的动态库很可能不能通用,但是 C 不存在这个问题,你可以用 2010 的 C 把动态库包装成 c 接口,再在其他编译器下调用
    About     Help     Advertise     Blog     API     FAQ     Solana     987 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 54ms UTC 22:54 PVG 06:54 LAX 15:54 JFK 18:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86