生成和链接动态库

news2024/11/21 21:12:14

生成和链接动态库

  • 在Linux和windows中的动态库是不一样的
    • linux 的动态库不需要设置导入导出符号,以.os为后缀
    • windows中需要设置导入和导出符号.lib,以及动态库的后缀是dll

1、windows环境

1、创建动态库

在这里插入图片描述

  • 项目结构

在这里插入图片描述

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.28)
project(shareddll)

set(CMAKE_CXX_STANDARD 17)

add_library(shareddll SHARED src/library.cpp)
target_compile_definitions(shareddll PRIVATE SHAREDLL_EXPORTS)

# 设置安装目录
SET(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}_bin)
#获取全部头文件
file(GLOB HEADERS "include/*.h")
# 拷贝头文件 到 include 目录下
INSTALL(FILES ${HEADERS} DESTINATION include)
# 拷贝动态库 到 lib 目录下
INSTALL(TARGETS shareddll DESTINATION bin)
  • library.h
#ifndef SHAREDDLL_LIBRARY_H
#define SHAREDDLL_LIBRARY_H
//在windows环境下,需要设置导入导出符号
#ifdef SHAREDLL_EXPORTS //在编译阶段定义SHAREDLL_EXPORTS,表示导出符号,即生成.lib文件
#define SHAREDDLL_API __declspec(dllexport)
#else					//如果是运行阶段,即使用这个库的程序,需要导入符号,即使用.lib文件
#define SHAREDDLL_API __declspec(dllimport)
#endif

SHAREDDLL_API void hello();
/**
 * 如果是类的导入导出,需要在类的定义前加上__declspec(dllexport)或者__declspec(dllimport)
 * 例如:
 * class SHAREDDLL_API Test{
 * public:
 *    void test();
 *}
 */

#endif //SHAREDDLL_LIBRARY_H

  • library.cpp
#include "../include/library.h"

#include <iostream>

void hello() {
	std::cout << "Hello, World!" << std::endl;
}

经过编译以后,会在built的目录下生成相关动态库文件

在这里插入图片描述

但是这样很难使用,我们可以安装这个库,让结构更加清晰且易于使用

在这里插入图片描述

点击install后,会生成如下文件

在这里插入图片描述

2、链接动态库
  • 项目结构

在这里插入图片描述

  • CMakeLists.txt
	cmake_minimum_required(VERSION 3.28)
project(sharedTest)

set(CMAKE_CXX_STANDARD 17)

include_directories(bin/shareddll_bin/include)

link_directories(bin/shareddll_bin/bin)

# 生成可执行文件
add_executable(sharedTest main.cpp)

# 链接动态库
target_link_libraries(sharedTest shareddll)
  • main.cpp
#include <iostream>
#include "library.h"
int main() {
	std::cout << "Hello, World!" << std::endl;
	hello();
	return 0;
}

在windows环境下链接动态库时出现的坑

  1. 报错:Process finished with exit code -1073741515 (0xC0000135)

错误原因:缺少dll文件

两种解决方案

  • 手动将dll文件放到build目录下(不推荐),因为如果我们删除build目录后还需要重新添加,很麻烦,容易出错

在这里插入图片描述

  • 为项目添加环境变量,这是我目前最好办法的解决办法,删除build目录后不需要重新手动添加,但是我觉得能在CMakeLists.txt里面解决的话是最好的

复制动态库bin目录的绝对路径(注意,我这里的bin目录是由lib文件的,如果没有lib文件会报错,等下在下面举例报错)

在这里插入图片描述

报错原因:缺少lib文件,即导入文件

在这里插入图片描述
在这里插入图片描述

解决方案就是添加导入文件,也就是我前面说到的

在这里插入图片描述

还有就是刚刚删除shareddll.lib然后撤销的时候报了如下错误,不知道什么原因,但是解决办法也很简单,将撤销得到的删除,重新复制一份即可

在这里插入图片描述

可能是撤销导致文件出错了

ddll.lib`然后撤销的时候报了如下错误,不知道什么原因,但是解决办法也很简单,将撤销得到的删除,重新复制一份即可
在这里插入图片描述

可能是撤销导致文件出错了

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1827296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode - 132双周赛

目录 一、3174. 清除数字 二、3175. 找到连续赢 K 场比赛的第一位玩家 三、3176. 求出最长好子序列 I 四、3177. 求出最长好子序列 II 一、3174. 清除数字 本题可以使用栈来模拟&#xff0c;遇到数字弹出栈顶元素&#xff0c;遇到字母入栈。 代码如下&#xff1a; //使用字…

ord版本升级(0.15升级到0.18.5)

1、升级rust ~# rustup update stable ~# rustc --versionrustc 1.79.0 (129f3b996 2024-06-10)2、拉取0.18.5代码 ~# wget https://github.com/ordinals/ord/archive/refs/tags/0.18.5.tar.gz ~# tar -xf 0.18.5.tar.gz ~# cd ord-0.18.5 ~# cargo build --release3、启动se…

在机器学习领域中,One-Hot Encoding是什么

一般来说&#xff0c;机器学习模型要求所有的输入输出变量都必须是数字。如果我们的数据中包含了分类数据&#xff0c;我们必须将它们编码成一些数字&#xff0c;这样我们才可以拿去训练和评测一个机器学习模型。 我们常说的分类数据是不能够直接拿来训练、预测的。因为它们一…

【每日随笔】摩托车控车 ① ( 油离配合 | 落脚油离配合 - 不给油 | 落脚油离配合 - 给油 | 正式油离配合 | 骑行姿态注意事项 )

文章目录 一、找 " 离合结合点 "二、落脚油离配合 ( 不给油 )1、该科目练习目的2、起步姿态3、开始练习 三、落脚油离配合 ( 给油 )1、练习目的2、熟悉油门转速3、练习步骤 四、正式油离配合五、骑行姿态注意事项1、基本骑行姿态2、骑摩托车的姿态 - 含胸收腹驼背3、…

uniapp使用css实现瀑布流

页面 <template><view><gj v-if"likeList.length 0"></gj><view v-else class"list"><view class"pbl" v-for"(item,index) in likeList" :key"index"><view class"image&quo…

Windows10 MySQL(8.0.37)安装与配置

一、MySQL8.0.37下载 官网下载链接&#xff1a; https://dev.mysql.com/downloads/ 解压文件&#xff0c;解压到你想要的位置 二、新建MySQL配置文件 右键新建文本文档 新建my.txt文件 编辑my.txt文件&#xff0c;输入以下内容 [mysqld] # 设置 3306 端口 port3306 # 设…

苹果电脑装虚拟机和双系统的区别 苹果笔记本虚拟机和双系统哪个好 虚拟机能装MacOS吗 虚拟机类似的软件

Mac电脑用户在需要使用Windows操作系统的软件时&#xff0c;通常会面临两个选择&#xff1a;安装双系统或使用虚拟机。两种方式各有优缺点&#xff0c;适用于不同的使用场景。本文将详细分析和说明Mac电脑装双系统和虚拟机之间的区别&#xff0c;帮助用户选择最适合自己的方案。…

前端网站(一)-- 登录页面及账号密码验证

前端网站&#xff08;一&#xff09;-- 登录页面及账号密码验证 开篇&#xff08;请大家看完&#xff09;&#xff1a;此网站写给挚爱&#xff0c;后续页面还会慢慢更新&#xff0c;大家敬请期待~ ~ ~ 轻舟所编写这个前端框架的设计初衷&#xff0c;纯粹是为了哄对象开心。除…

<Linux>进程

进程 文章目录 进程PCBpid与ppidfork系统调用进程状态孤儿进程状态优先级环境变量进程地址空间虚拟地址 最直观的表示&#xff1a;启动一个软件&#xff0c;本质就是启动一个进程 PCB PCB是Process Control Block的简称&#xff0c;是用来描述进程状态信息的数据结构。 进程运…

了解并解决 Flutter 中的灰屏问题

生产中的 flutter 应用程序中的灰屏是一种通用占位符&#xff0c;当框架遇到问题无法渲染预期用户界面时就会显示。是的&#xff0c;所以基本上是出现问题时的后备指示器。 有趣的是&#xff0c;这只出现在发布模式下。在任何其他模式下运行都会显示红色错误屏幕&#xff0c;并…

课设--学生成绩管理系统(二)

欢迎来到 Papicatch的博客 目录 &#x1f40b;引言 &#x1f988;编写目的 &#x1f988;项目说明 &#x1f40b;产品介绍 &#x1f988;产品概要说明 &#x1f988;产品用户定位 &#x1f988;产品中的角色 &#x1f40b; 产品总体业务流程图 &#x1f40b; 产品功…

【PL理论】(25) C- 语言:表达式求值的推理规则 | 执行语句的推理规则 | 语句执行的推理规则

&#x1f4ad; 写在前面&#xff1a;本章我们将继续更新我们的 "C-" 语言&#xff0c;更新表达式求值的推理规则、执行语句的推理规则以及语句执行的推理规则。 目录 0x00 C- 语言更新&#xff1a;表达式求值的推理规则 0x01 C- 语言更新&#xff1a;执行语句的推…

观察者模式(大话设计模式)C/C++版本

观察者模式 扩展&#xff1a;观察者模式——委托 C 参考&#xff1a;https://www.cnblogs.com/Galesaur-wcy/p/15905936.html #include <iostream> #include <list> #include <memory> #include <string> using namespace std;// Observer类 抽象观…

港科夜闻 | 香港科大与香港科大(广州)合推红鸟跨校园学习计划,共享教学资源,促进港穗学生交流学习...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与香港科大(广州)合推“红鸟跨校园学习计划”&#xff0c;共享教学资源&#xff0c;促进港穗学生交流学习。香港科大与香港科大(广州)6月14日共同宣布推出“红鸟跨校园学习计划”&#xff0c;以进一步加强两校学…

5.拼数 - 蓝桥杯

基础知识要求&#xff1a; Java&#xff1a;for循环、if判断、Scanner类、数组、字符串 Python&#xff1a; for循环、if判断、列表、字符串、input() 题目&#xff1a; 思路解析&#xff1a; 读取输入&#xff1a; 首先读取要排序的字符串数量。然后读取相应数量的字符串&am…

【Redis】String的常用命令及图解String使用场景

本文将详细介绍 Redis String 类型的常见命令及其使用场景&#xff0c;包括缓存、计数器、共享会话、手机验证码、分布式锁等场景&#xff0c;并且配图和伪代码进一步方便理解和使用。 命令执行效果时间复杂度set key value [key value…]设置key的值是valueO(k),k是键个数get…

使用消息队列(MQ)实现MySQL持久化存储与MySQL server has gone away问题解决

在现代应用程序开发中&#xff0c;消息队列&#xff08;MQ&#xff09;扮演着重要的角色。它们可以帮助我们解决异步通信和解耦系统组件之间的依赖关系。而其中一个常见的需求是将消息队列中的数据持久化到数据库中&#xff0c;以确保数据的安全性和可靠性。在本文中&#xff0…

gbase8s数据库阻塞检查点和非阻塞检查点的执行机制

1. 检查点的描述 为了便于数据库系统的复原和逻辑恢复&#xff0c;数据库服务器生成的一致性标志点&#xff0c;称为检查点&#xff0c;其是建立在数据库系统的已知和一致状态时日志中的某个时间点检查点的目的在于定期将逻辑日志中的重新启动点向前移动 如果存在检查点&#…

【Quartus 13.0】NIOS II 部署UART 和 PWM

打算在 EP1C3T144I7 芯片上部署 nios ii 做 uart & pwm控制 这个芯片或许不够做 QT 部署 这个芯片好老啊&#xff0c;但是做控制足够了&#xff0c;我只是想装13写 leader给的接口代码是用VHDL写的&#xff0c;我不会 当然verilog我也不太会 就这样&#xff0c;随便写吧 co…

[大模型]XVERSE-7B-chat Transformers 推理

XVERSE-7B-Chat为XVERSE-7B模型对齐后的版本。 XVERSE-7B 是由深圳元象科技自主研发的支持多语言的大语言模型&#xff08;Large Language Model&#xff09;&#xff0c;参数规模为 70 亿&#xff0c;主要特点如下&#xff1a; 模型结构&#xff1a;XVERSE-7B 使用主流 Deco…