当前位置:网站首页>CLion编译和使用动态库
CLion编译和使用动态库
2022-07-19 20:29:00 【hitzsf】
1. 使用Clion 开发动态库文件
1.1 动态库简介
注意:在 linux 平台下,动态库和静态库的源代码是完全一样的,只需要修改编译参数即可。在 Windows 平台中生成动态库其源码和静态库是不同的。
在 Windows 平台中,我们导出动态库时,除了会生成 .dll 动态库之外还会生成一个 .lib 文件。这个 .lib 文件和静态库的 .lib 文件不同,它里面并不保存代码生成的二进制文件,而是所有需要导出符号的符号表。因此这个 .lib 文件和编译静态库生成的 .lib 文件相比会小很多。而这个导出的符号表是需要我们在源码中进行指定的。如果我们希望将将一个符号(symbol)导出(这里的符号可以指类、函数等各种类型),需要在其前面加上 __declspec(dllexport) 标志。这样这个符号的相关信息就会导出的 .lib 中的符号表中了。如果我们的源码中没有任何 __declspec(dllexport) 的话,我们依然可以成功的编译出动态库,但是并不会生成保存符号表的.lib 文件。这也是在 Windows 平台下编译动态库经常出现的问题,如果我们的源码是在 Linux 平台下编写的话,更是很容易忘记修改源码。
原文链接:https://blog.csdn.net/Snow__Sunny/article/details/123182732
如上所述,windows下的动态库源代码要实现跨平台的特性就会比较麻烦,不过好在cmake有自己的解决方法,知道原理是啥就行。
1.2 新建Library项目
1.3 CmakeLists.txt的设置
GenerateExportHeader — CMake 3.24.0-rc3 Documentation
cmake_minimum_required(VERSION 3.22)
set(CMAKE_CXX_STANDARD 14)
project(MyDLL)
# 导入 GenerateExportHeader 函数
include(GenerateExportHeader)
#set(CMAKE_CXX_VISIBILITY_PRESET hidden)
#set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
# 判断是否是debug模式,如果是debug,则后缀加‘d',比如 MyDLLd.dll MyDLLd.lib
set(DEBUG_SUFFIX)
if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
set(DEBUG_SUFFIX "d")
endif ()
# CMAKE_DEBUG_POSTFIX 全局变量用于附加 d对于调试库:
set(CMAKE_DEBUG_POSTFIX d)
# 定义目标名称变量
set(TargetName ${
PROJECT_NAME})
message(${
TargetName})
# 生成 动态的 MyDLL.dll 文件
add_library(${
TargetName} SHARED library.cpp)
# MyDLL export宏定义, 生成的文件名为 mydll_export.h, 路径: ${
PROJECT_BINARY_DIR}
GENERATE_EXPORT_HEADER(${
TargetName})
INCLUDE_DIRECTORIES(${
PROJECT_BINARY_DIR})
# 设置安装目录
SET(CMAKE_INSTALL_PREFIX ${
PROJECT_BINARY_DIR}/${
PROJECT_NAME}_lib)
# 拷贝头文件 到 include 目录下
INSTALL(FILES library.h ${
PROJECT_BINARY_DIR}/mydll_export.h DESTINATION include)
# 将 dll 和 lib 库文件 分别放到 lib 和 bin 目录下
INSTALL(TARGETS ${
TargetName} LIBRARY DESTINATION lib)
Reload Cmake Project 后,在项目的二进制目录下自动生成mydll_export.h
1.4 ABI文件导入mydll_export.h
导入头文件后,并使用MYDLL_EXPORT 声明到处的函数
1.5 构建项目
构建项目执行后,会生成相关的库文件,如下图所示:
1.6 安装
点击Install后,会自动将库文件放到相应的目录下
2. 使用第三方动态库文件
动态库就使用生成的MyDLL
2.1 新建项目
2.2 复制MyDLL库文件到源代码目录
2.3 CmakeLists.txt的设置
cmake_minimum_required(VERSION 3.22)
project(UseDLL)
set(CMAKE_CXX_STANDARD 14)
# 判断是否是debug模式,如果是debug,则后缀加‘d',比如 MyDLLd.dll MyDLLd.lib
set(DEBUG_SUFFIX)
if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
set(DEBUG_SUFFIX "d")
endif ()
# CMAKE_DEBUG_POSTFIX 全局变量用于附加 d对于调试库:
#set(CMAKE_DEBUG_POSTFIX d) # 这玩意在使用库文件的时候,似乎没有用处
add_executable(UseDLL main.cpp)
#INCLUDE_DIRECTORIES(MyDLL_lib/include) # 这种方式也可以导入库文件
# 为目标添加 include 目录
target_include_directories(UseDLL
PUBLIC
${
PROJECT_SOURCE_DIR}/MyDLL_lib/include)
message(${
PROJECT_SOURCE_DIR}/MyDLL_lib/lib/MyDLL${
DEBUG_SUFFIX})
# 为目标 链接添加 lib文件
target_link_libraries(UseDLL
PRIVATE
${
PROJECT_SOURCE_DIR}/MyDLL_lib/lib/MyDLL${
DEBUG_SUFFIX}.lib)
# 这种用目录的方式处理的不是很好,需要明确指定到lib的文件名,应该有其他的方式
2.4 使用库中的头文件
2.5 编译运行
将dll文件复制到二进制目录,然后编译运行即可
顺利打印出“hello,World!”
边栏推荐
- 金仓数据库 KingbaseES SQL 语言参考手册 (3.2. 数据类型比较规则)
- 排序--插入排序、希尔排序
- 解析创客教育课程设置中的创新思维
- 数据从Oracle迁移至PolarDB for PostgreSQL的过程中,数据迁移具体指什么?
- The R language uses the gghistogram function of ggpubr package to visualize the grouping box diagram, add the grouping mean value, customize the grouping color, add the axial whisker diagram (rug), ad
- 解析高质量STEAM教育中的探究
- LVGL 8.2 Span
- 指针数组跟数组指针的简单范例
- 目前有哪些工具可以连接PolarDB for PostgreSQL数据库并对其进行管理?
- 剑指Offer 71:跳台阶扩展问题
猜你喜欢
面试大厂Android开发的准备
VMware solves the problem of not recognizing USB
JSON format interface test process
Skywalking full link monitoring cluster and dynamic deployment
Swagger 简单快速入门教程
解析高质量STEAM教育中的探究
Redis high availability: do you call this the principle of master-slave architecture data synchronization?
[record of question brushing] 15 Sum of three numbers
STM32 Hal library serial port sends and receives at the same time, and the receiving is stuck?
树的定义和基本术语
随机推荐
Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计
【golang从入门到实践】石头剪刀布游戏
医疗行业数据安全最佳实践案例(脱敏版)
LVGL 8.2 Roller
PMP每日一练 | 考试不迷路-7.19
适合送礼的蓝牙耳机有哪些?2022蓝牙耳机排行榜10强
STM32 HAL库串口同时收发,接收卡死?
TS学习(七) :TS的接口与类型兼容
php 百度有钱花分期API
请问Redis 如何实现库存扣减操作和防止被超卖?
適合送禮的藍牙耳機有哪些?2022藍牙耳機排行榜10强
手撕快速排序
LVGL 8.2 Slider
Redis is awesome. If you don't understand the usage specification, it will be ruined
泡泡玛特7天市值蒸发210亿港元,国内卖不动,出海前途未卜
Which Bluetooth headsets are suitable for gift giving? Top 10 Bluetooth headsets in 2022
Mysql8.0 new feature - persistence of self increasing variables
Source code of short video system, loading order of main files in uni app project
Oracle 里 TCP Socket (KGAS) 这个等待事件一般是什么导致?
The basic operation of data tables in MySQL is very difficult. This experiment will take you through it from the beginning