V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
bankroft
V2EX  ›  问与答

求大哥救救小弟吧, cmakelist 或者 Qt 里 怎么写才能 link dll

  •  
  •   bankroft · 2021-05-15 23:36:59 +08:00 · 728 次点击
    这是一个创建于 1049 天前的主题,其中的信息可能已经有所发展或是发生改变。

    .h 文件已经 include

    现在有几个 dll 和 lib

    common32.lib
    common32.dll
    OmniDriver32.lib
    OmniDriver32.dll
    SPAM32.lib
    SPAM32.dll
    
    #include "Wrapper.h"
    int main() {
        Wrapper wrapper;
    }
    
    link_directories("lib/op")
    
    add_executable(${PROJECT_NAME} main.cpp)
    
    target_link_libraries(${PROJECT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/lib/op/common32.lib")
    target_link_libraries(${PROJECT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/lib/op/OmniDriver32.lib")
    target_link_libraries(${PROJECT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/lib/op/SPAM32.lib")
    

    上面是我写的,op 里就是 dll 和 lib,我不知道为啥一直报undefined reference to Wrapper::Wrapper()

    然后这个库怎么编译的也不知道

    查了很多资料都一直报上面的错

    求个大哥帮小弟脱离苦海吧🧎‍♂️🧎‍♂️🧎‍♂️

    或者给点搜索的内容吧🧎‍♂️🧎‍♂️🧎‍♂️

    相关文档 密码 605312

    11 条回复    2021-05-17 21:10:08 +08:00
    ysc3839
        1
    ysc3839  
       2021-05-16 02:01:38 +08:00 via Android   ❤️ 1
    没记错的话 cmake 的 target_link_libraries 指的是链接已经在 cmake 中注册的 library 。
    你要直接链接 .lib 文件的话,应该给链接器加参数。
    azenk
        2
    azenk  
       2021-05-16 07:34:20 +08:00 via Android   ❤️ 1
    bankroft
        3
    bankroft  
    OP
       2021-05-16 10:42:21 +08:00
    @ysc3839 #1 我试了直接加参数,-lcommon32 -lOmniDriver32, 还是报同样的错误

    @azenk #2 后缀加或者不加都试了,还是报错

    c++太难了😭😭😭
    zacharyjia
        4
    zacharyjia  
       2021-05-16 11:07:18 +08:00   ❤️ 1
    你那个 link_directories,为什么不写完整路径呢?
    试试 link_directories 用完整路径,然后 target_link_libraries 只写库名?
    bankroft
        5
    bankroft  
    OP
       2021-05-16 12:27:53 +08:00
    @zacharyjia #4 完整路径也不行,试了绝对路径和相对路径的各种组合都是一样的错误,undefined reference
    zacharyjia
        6
    zacharyjia  
       2021-05-16 12:58:18 +08:00   ❤️ 1
    @bankroft 不知道你是啥情况,我按下面这个配置能编译成功,你参考一下吧
    https://paste.ubuntu.com/p/kQMTgVk8Cz/
    bankroft
        7
    bankroft  
    OP
       2021-05-16 13:06:42 +08:00
    @zacharyjia #6 我试试放虚拟机里编译,不知道跟我物理机环境有没有关系
    ysc3839
        8
    ysc3839  
       2021-05-16 14:29:15 +08:00 via Android   ❤️ 1
    @bankroft 你这参数不对呀,你用的是 .lib 文件,那明显是 MSVC 编译器吧,MSVC 用的不是这样的参数语法。
    印象中 MSVC 的链接器直接传 .lib 完整路径就可以了,不需要加什么前缀。
    bankroft
        9
    bankroft  
    OP
       2021-05-16 20:19:40 +08:00 via Android
    @ysc3839 这么一讲突然发现一个问题,我用的 mingw, 我要导入的是 msvc 编译的。改 msvc 试一下。希望可以
    ysc3839
        10
    ysc3839  
       2021-05-16 20:43:16 +08:00   ❤️ 1
    @bankroft 你用 mingw 的话那不能用 MSVC 的 .lib 文件,得自己通过 DLL 生成 .a 文件。而且也不能用 C++ API,只能用 C API 。
    bankroft
        11
    bankroft  
    OP
       2021-05-17 21:10:08 +08:00
    谢谢楼上的老哥们,问题已解决,编译器不一样的问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2579 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:39 · PVG 23:39 · LAX 08:39 · JFK 11:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.