| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> Windows 上开发使用跨平台 C++ 动态链接库 (DLL) -> 正文阅读 |
|
[C++知识库]Windows 上开发使用跨平台 C++ 动态链接库 (DLL) |
起因学习过程中, 准备从网上使用一个使用 CMake 管理的 C++ 库项目, 这个项目将构建为一个动态链接库 (DLL). 在 Windows 上, 动态链接库本身可以完成编译链接过程且不报错, 而调用该库的程序能够完成编译, 但是在链接过程提示 “未定义符号 (undefined symbols)” (经过确认为动态库里的符号). 经过检查, 链接使用的命令没有问题, 那么就意味着链接器没有找到这些符号, 但是为什么会出现这样的情况, 以及该如何解决呢?
一个简单的例子接下来用一个简单的例子来说明下这个问题. 项目源代码参考 cpp-multi-file-demo 仓库. 使用到的 Date 库例子中有一个简单的
稍微修改该 CMake, 使得
调用 Date 库之后调用这个库. 这里是将 在项目构建时,
问题复现为了更好地说明问题, 体现跨平台的特性, 这里分别在 Linux 和 Windows 上进行测试. 在 Ubuntu 上构建首先尝试在 Ubuntu 上构建. 将项目下载到本地, 按照上述修改 Date/CMakeLists.txt 中的 使用的过程就是一个基本的 CMake 项目的构建流程:
通过 在 Windows 上构建首先打开我们的 Visual Studio 老大哥. 默认 Visual Studio 使用的是自家的 MSVC 编译器. 可以看到结果是生成失败, “fatal erroe LNK1104: 无法打开文件 Date/Date.lib”. 经过检查发现文件夹里确实没有
之后换用 Clang for MSVC, 虽然输出了 原因和解决办法通过查询可知, 在 Linux 上动态库默认是导出所有符号的, 而 Windows 则不然, 还需要单独的 LIB 文件来配套动态链接库使用. 详情可以参考微软的文档 Exporting from a DLL - Microsoft Docs, 或者自行搜索相关关键词 (如 “Windows” “DLL” “symbols” 等). 这里介绍一个简单的解决方法, 即在 CMake 进行 Configure 的过程中, 传递这样一个选项, 即 CMake 传递选项的方法下面介绍几个常用 IDE 中添加 CMake 选项的方式. 要添加的选项就是 Visual Studio Code + CMake Tools图形化界面的添加方法如下: 这个选项也可以设置成目录的 (而非全局的), 也就是在工作目录下新建一个 文件
Visual Studio确保在 Visual Studio 中打开的是一个 CMake 项目. 在 “项目” 菜单里选择 “ 这会在 CMake 项目下生成一个 CLionCLion 的配置也是类似,在 “文件 (Files)” → “设置 (Settings)” → “构建, 执行, 部署 (Build, Execution, Deplyment)” → “CMake” 中, 在某个配置中的 CMake options 中添加要传递给 CMake 的选项. 使用动态链接库的问题在笔者测试时, 在执行
解决方式也就是让可执行文件能够找到库文件即可, 也就是保证 DLL 的搜索路径里存在需要的文件. 一般来说, 手动将生成的 DLL 库复制到
在 Visual Studio 中, 会默认设置 在其他 IDE 中, 若没有设置该变量, 则 CMake 默认会安装到系统的目录去, 在 Windows 上就是 按理说, 共享库确实应该安装到一个 “共享” 的地方. 但是由于自己调试期间写的程序可能不标准, 安装到系统目录去一般也不是啥好事, 因此一般要特别处理这些问题, 比如手动复制库文件或者修改 CMake 的安装前缀. Windows 上的 Visual Studio 在添加了 install 目标的情况下, 会出现一个带有 “(安装)” 字样的运行选项, 点击即可进行安装并直接运行安装后的可执行程序. Windows 上其他的 IDE 推荐在项目的 CMakeLists.txt 中设定
之后运行相应的 “安装” 目标 (或者 install ALL 安装所有目标), 把文件都安装到同一个目录下, 总之确保可执行文件依赖的 DLL 文件都能够被找到.
这样之后可执行程序便应当能够正常运行. 不过需要注意执行的是安装目录里的可执行文件, 而不是构建目录里的. 为了方便, 可以在 IDE 中进行一些配置. Visual Studio Code 的 CMake Tools 插件暂时不清楚该如何配置, 不过至少可以通过命令行手输命令执行. CLion 中可以参考如下方式, 修改 “Run/Debug Configuration” 中的 “Working directory” 并添加 “Before launch” 的任务来实现: 至此, 问题就应该全部解决了. 总结总结就是, 尽量少用动态链接库… |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 15:41:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |