生成和链接动态库

生成和链接动态库

  • 在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)
#endifSHAREDDLL_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.mzph.cn/pingmian/28116.shtml

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

相关文章

如何使用 pip 卸载所有已安装的 Python 包?

在开发过程中,我们可能会安装许多 Python 包,有时需要彻底清理环境,以便从头开始或者解决冲突问题。下面将介绍如何使用 pip 命令卸载所有已安装的 Python 包。 一、列出所有已安装的包 首先,需要列出当前环境中所有已安装的包。使用以下命令: pip freeze这将输出所有已…

使用Ventoy 替代Win_To_Go更好的随身系统

Ventoy支持在物理机上直接启动安装了 Linux/Windows 系统的 磁盘映像文件 。 系统是在真实物理机上运行&#xff0c;并不是在虚拟机里运行&#xff0c;没有性能损失。支持 Legacy BIOS 和 UEFI 模式。支持从任意磁盘启动磁盘映像。 Windows 支持固定大小以及动态扩展类型的 VH…

设计模式-代理模式Proxy(结构型)

代理模式&#xff08;Proxy&#xff09; 代理模式是一种结构型模式&#xff0c;它可以通过一个类代理另一个类的功能。代理类持有被代理类的引用地址&#xff0c;负责将请求转发给代理类&#xff0c;并且可以在转发前后做一些处理 图解 角色 抽象主题&#xff08;Subject&…

ActiViz中的拾取函数介绍

文章目录 1. 拾取函数概述2. 拾取函数的类型3. 拾取函数的工作流程4. 点拾取函数(vtkPointPicker)5. 单元拾取函数(vtkCellPicker)6. 世界坐标拾取函数(vtkWorldPointPicker)7. 近场拾取函数(vtkPropPicker)8. 拾取函数的工作流程9. 点拾取函数(vtkPointPicker)详解1…

光功率计传感器

光探测仪表: 激光功率计探头按照不同的原理和材料分为热电堆型、光电二极管型以及包含两种传感器的综合探头, 激光能量计则有热释电传感器和热电堆传感器探头 热释电效应传感器: 热释电传感器的工作原理主要是基于热释电效应。当物体处于不同温度时,会发射出不同强度的红…

gcn+tcn+transformer入侵检测

gcn gcn_out self.gcn(A_hat, D_hat, X) 的公式实际上是图卷积网络&#xff08;GCN&#xff09;层的核心操作。具体来说&#xff0c;这一步的计算基于图卷积的基本公式&#xff1a; H ( l 1 ) σ ( D ^ − 1 / 2 A ^ D ^ − 1 / 2 H ( l ) W ( l ) ) H^{(l1)} \sigma\left…

新人学习笔记之(常量)

一、什么是常量 1.常量&#xff1a;在程序的执行过程中&#xff0c;其值不能发生改变的数据 二、常量的分类 常量类型说明举例整型常量整数、负数、0123 456实型常量所有带小数点的数字1.93 18.2字符常量单引号引起来的字母、数字、英文符号S B字符串常量双引号引起来的&…

深入剖析 Laravel 框架:构建高效PHP应用的最佳实践

引言 随着互联网的高速发展&#xff0c;PHP 作为一门广泛使用的服务器端脚本语言&#xff0c;始终备受开发者青睐。而在众多 PHP 框架中&#xff0c;Laravel 凭借其优雅的设计和高效率&#xff0c;成为了构建现代 Web 应用的热门选择。本文将从零开始&#xff0c;探讨如何使用 …

【ubuntu中的docker记录】—— 使用docker的常用的指令记录,持续更新中

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、docker启动类指令二、docker镜像操作类指令三、docker容器操作类指令总结 前言 Docker常用指令如docker run、docker build、docker pull等&#xff0c;使…

镍电解阳极液深度除铜树脂

摘要&#xff1a;HP686适用于以下行业中的铜、镍等金属选择性吸附&#xff1a; • 可用于锂电正极材料、锂电回收等生产过程中回收镍、铜&#xff0c;料液纯化 • 可在酸性条件下 (pH< 2) &#xff0c;吸附铜离子 • 钴电解液中去除镍离子&#xff0c;纯化电解液 • 可在…

面向对象前置(java)

文章目录 环境配置相关如何在 cmd 任何路径下中 使用 javac(编译) 和 java(运行) 指令path变量的含义javac(编译&#xff09;使用java(运行&#xff09;的使用public class 和 class 的区别 标识符命名规则命名规范 字面量字符串拼接变量的作用域转移字符类型转换接收用户键盘输…

配置 SSH 管理多个 Git 仓库和以及多个 Github 账号

在工作中&#xff0c;我们可能需要将代码推送到公司内部的自建 Git 代码托管平台&#xff08;如 GithLab&#xff09;。与此同时&#xff0c;日常开发过程中&#xff0c;我们也常常需要将代码提交到社区的 Git 代码托管平台&#xff08;如 Github 等&#xff09;。提交到 githu…

公差基础-配合(互换性和测量基础)-2

过盈配合&#xff1a; 配合的种类&#xff1a; 三种&#xff1a;间隙&#xff0c;过渡&#xff0c;过盈配合&#xff1a; 间隙配合&#xff1a; 过盈配合&#xff1a; 过渡配合&#xff1a; 间隙量&#xff1a;最大间隙减去最小间隙&#xff1b; 配合的公差怎么算&#xff1a…

江协科技STM32学习- 2安装Keil5-MDK

本文是根据哔哩哔哩网站上“江协科技STM32”视频的学习笔记&#xff0c;在这里会记录下江协科技STM32开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技STM32教学视频和链接中的内容。 引用&#xff1a; STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩…

TypeScript入门教程

今天&#xff0c;给大家分享一个自己总结的超详细的TypeScript入门教程电子书。从TypeScript的基础知识开始讲解&#xff0c;包括数据类型、变量、运算符、条件语句、循环结构等基本概念。接着&#xff0c;详细介绍TypeScript中的函数、类和接口等高级特性&#xff0c;以及如何…

Oracle阅读Java帮助文档

进入到Help Center 选择Java 查看Java SE [version]对应版本相关的内容 查看其它版本 查看Java11 javac等相关参数 目录查看java相关命令

费曼的博士学位论文及下载

原始链接 PDF影印版下载 以前看《费曼物理学讲义》觉得最小作用原理部分讲得非常多、而且比较炫。现在知道原因了。 The principle of least action in quantum mechanics Richard Phillips Feynman(Princeton U. )May, 1942 74 pages Supervisor: John Archibald Wheeler…

【Mac】Luminar Neo for mac(图像编辑软件)软件介绍及同类型软件比较

Luminar Neo软件介绍 Luminar Neo 是一款由 Skylum 开发的功能强大的照片编辑软件&#xff0c;专为摄影师和摄影爱好者设计。它适用于 Mac 和 Windows 平台&#xff0c;提供了一系列先进的编辑工具和功能&#xff0c;使用户能够轻松提升和优化他们的照片。以下是 Luminar Neo …

篮球杯小白+强者

2. 宣读数字【算法赛】 思维题&#xff0c;注意到完全平方数的约数是奇数个&#xff0c;其余都是偶数个。 #include <bits/stdc.h>using namespace std;#define LL long long#define pb push_back#define x first#define y second #define int long long #define endl \n…

Linux tail 命令跟踪文件的最新更改情况

tail命令 用于显示文件的最后几行或者跟踪日志文件的更新。这个命令的基本用法是显示指定文件的最后十行。 格式 tail 文件名参数 查看文件后5行 tail -5 test.txt持续的跟踪文件状态 tail -f test.txt 这时候进程会卡在该命令&#xff0c;持续的跟踪&#xff0c;其他窗…