Windows下使用CMake生成并使用动态库

news2024/11/21 0:12:37

生成动态库

// example.h

#pragma once

#include <iostream>

#ifdef EXAMPLE_EXPORTS
#define EXAMPLE_API __declspec(dllexport)
#else
#define EXAMPLE_API __declspec(dllimport)
#endif

class EXAMPLE_API MyClass
{
public:
    MyClass();

    ~MyClass();

    void memberFunction();
};
#include "example.h"

MyClass::MyClass()
{
}

MyClass::~MyClass()
{
}

void MyClass::memberFunction()
{
    std::cout << "111" << std::endl;
}

// CMakeLists.txt

# CMake最低版本要求
cmake_minimum_required (VERSION 2.0)

# 项目名称
project(ExampleLibrary)

# 设置编译器标准
set(CMAKE_CXX_STANDARD 11)

# 添加生成的DLL文件
add_library(example SHARED example.cpp example.h)

# 定义导出宏以控制导入导出
target_compile_definitions(example PRIVATE EXAMPLE_EXPORTS)

在这里插入图片描述
生成的动态库和静态库在build/Debug目录下

使用动态库

在这里插入图片描述
1、拷贝头文件和静态库到当前目录下

2、创建bin目录,在里面创建Debug目录,并把动态库拷贝到Debug目录下

在这里插入图片描述

// main.cpp

#include <iostream>
#include "example.h"

int main()
{
    // 使用动态链接库中的类和函数
    MyClass *myObject = new MyClass();
    myObject->memberFunction();

    delete myObject;
    return 0;
}
// CMakeLists.txt

# CMake最低版本要求
cmake_minimum_required(VERSION 3.0)

# 项目名称
project(main)

# 设置编译器标准
set(CMAKE_CXX_STANDARD 11)

# 添加动态库路径
link_directories(${CMAKE_CURRENT_SOURCE_DIR})

# 添加生成的可执行文件
add_executable(main main.cpp)

# 查找动态库并链接
target_link_libraries(main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/example.lib)

# 指定输出目录
set_target_properties(main PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin
)

在这里插入图片描述
生成的的exe就在bin/Debug目录下

在这里插入图片描述
在命令行执行main.exe就会看到输出。

问题1:为什么要把动态库放在bin/Debug目录下

因为exe执行时需要找到动态库的路径,要么设置环境变量,要么拷贝到同级目录下。

问题2:修改动态库的代码之后还需要生成吗

不需要生成,修改动态库代码之后重新生成动态库,将动态库替换即可。

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

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

相关文章

Pytorch手撸Attention

Pytorch手撸Attention 注释写的很详细了&#xff0c;对照着公式比较下更好理解&#xff0c;可以参考一下知乎的文章 注意力机制 import torch import torch.nn as nn import torch.nn.functional as Fclass SelfAttention(nn.Module):def __init__(self, embed_size):super(S…

Kafka安装Windows版

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Kafka 是一个由 LinkedIn 开发的分布式消息系统,它于2011年年初开源,现…

java byte数组转String

hi&#xff0c;我是程序员王也&#xff0c;一个资深Java开发工程师&#xff0c;平时十分热衷于技术副业变现和各种搞钱项目的程序员~&#xff0c;如果你也是&#xff0c;可以一起交流交流。 今天我们聊聊Java中Byte数组转String的用法~ 转换方法概览 在Java中&#xff0c;将b…

【人工智能】机器学习算法综述及常见算法详解

目录 推荐 1、机器学习算法简介 1.1 机器学习算法包含的两个步骤 1.2 机器学习算法的分类 2、线性回归算法 2.1 线性回归的假设是什么&#xff1f; 2.2 如何确定线性回归模型的拟合优度&#xff1f; 2.3 如何处理线性回归中的异常值&#xff1f; 3、逻辑回归算法 3.1 …

蓝桥杯2024年第十五届省赛

E:宝石组合 根据给的公式化简后变为gcd(a,b,c)根据算数基本定理&#xff0c;推一下就可以了 然后我们对1到mx的树求约数&#xff0c;并记录约数的次数&#xff0c;我们选择一个最大的且次数大于等3的就是gcd int mx; vector<int> g[N]; vector<int> cnt[N]; int…

深入刨析 mysql 底层索引结构B+树

文章目录 前言一、什么是索引&#xff1f;二、不同索引结构对比2.1 二叉树2.2 平衡二叉树2.3 B-树2.4 B树 三、mysql 的索引3.1 聚簇索引3.2 非聚簇索引 前言 很多人看过mysql索引的介绍&#xff1a;hash表、B-树、B树、聚簇索引、主键索引、唯一索引、辅助索引、二级索引、联…

【面经】2024春招-云计算后台研发工程师2(三大行 TW等)

【面经】2024春招-云计算后台研发工程师2&#xff08;三大行 & TW等&#xff09; 文章目录 岗位与面经基础1&#xff1a;数据库 & 网络基础2&#xff1a;系统 & 网络编程模板3&#xff1a;算法 & 行测 岗位与面经 1、银行面经&#xff08;重点&#xff09; …

MinIO自定义权限控制浅研

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 MinIO搭建好之后&#xff0c;出于不同场景的需要&#xff0c;有时候需要对不同的用户和Bucket做一些针对性的权限控制。 MinIO的…

2024年短剧素材怎么下载

看到好看的短剧&#xff0c;想要把它剪辑出来&#xff0c;该怎么下载呢&#xff0c;本文就教大家用工具进行下载 需要工具的点击下面的链接 下载高手链接&#xff1a;https://pan.baidu.com/s/1qJ81sNBzzzU0w6DWf-9Nxw?pwdl09r 提取码&#xff1a;l09r --来自百度网盘超级…

CommunityToolkit.Mvvm笔记---ObservableValidator

ObservableValidator 是实现 INotifyDataErrorInfo 接口的基类&#xff0c;它支持验证向其他应用程序模块公开的属性。 它也继承自 ObservableObject&#xff0c;因此它还可实现 INotifyPropertyChanged 和 INotifyPropertyChanging。 它可用作需要支持属性更改通知和属性验证的…

Pytest精通指南(19)断言和异常处理

文章目录 Pytest assert 简介assert 应用场景assert 测试结果assert 基本用法Pytest raises 简介raises 用途和作用raises 与 try 的区别python代码中使用try在测试用例中使用try使用pytest.raises() Pytest assert 简介 断言&#xff08;Assertion&#xff09;是编程中的一个基…

代码随想录算法训练营Day4 | 24.两两交换链表中的节点、19删除链表中的第N个节点、链表相交、142.环形链表

24.两两交换链表中的节点 题目&#xff1a;给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 题目链接&#xff1a;24. 两两交换…

蛋白质亚细胞定位预测(生物信息学工具-017)

直奔主题&#xff0c;下面这张表图怎么制作&#xff0c;一般都是毕业论文hh&#xff0c;蛋白质的亚细胞定位如何预测&#xff1f; 01 方法 https://wolfpsort.hgc.jp/ #官网小程序&#xff0c;简单好用&#xff0c;不用R包&#xff0c;python包&#xff0c;linux程序&#x…

Linux的学习之路:14、文件(1)

摘要 有一说一文件一天学不完&#xff0c;细节太多了&#xff0c;所以这里也没更新完&#xff0c;这里部分文件知识&#xff0c;然后C语言和os两种的文件操作 目录 摘要 一、文件预备 二、c文件操作 三、OS文件操作 1、系统文件I/O 2、接口介绍 四、思维导图 一、文件…

C++笔记:类和对象(一)

类和对象 认识类和对象 先来回忆一下C语言中的类型和变量&#xff0c;类型就像是定义了数据的规则&#xff0c;而变量则是根据这些规则来实际存储数据的容器。类是我们自己定义的一种数据类型&#xff0c;而对象则是这种数据类型的一个具体实例。类就可以理解为类型&#xff0c…

在Ubuntu 22.04上安装配置VNC实现可视化

前面安装的部分可以看我这篇文章 在Ubuntu 18.04上安装配置VNC实现Spinach测试可视化_ubuntu18开vnc-CSDN博客 命令差不多一样&#xff1a; sudo apt update sudo apt install xfce4 xfce4-goodies sudo apt install tightvncserver这个时候就可以启动server了 启动server&…

音频---数字mic

一、常见的数字mic pdm麦通过codec芯片将数字麦转换为i2s信号输入到SOC 纯pdm麦就是直接进入SOC的pdm接口&#xff0c;走的是PDM信号&#xff0c;PDM信号就是两个线&#xff0c;一根数据线一根时钟线&#xff08;如顺芯ES7201/7202把MIC信号转换成PDM&#xff09;。 二、DMIC…

等保合规:保护企业网络安全的必要性与优势

前言 无论是多部网络安全法律法规的出台&#xff0c;还是最近的“滴滴被安全审查”事件&#xff0c;我们听得最多的一个词&#xff0c;就是“等保。” 只要你接触安全类工作&#xff0c;听得最多的一个词&#xff0c;一定是“等保。” 那么&#xff0c;到底什么是“等保”呢…

Docker部署SpringBoot服务(Jar包映射部署)

介绍 项目在docker部署运行以后&#xff0c;每次需更新jar包时&#xff0c;都得重新制作镜像&#xff0c;再重新制作容器。流程及其繁琐&#xff0c;效率极低。 以下步骤是在不更新镜像和容器的前提下&#xff0c;直接更新jar完成项目更新的操作。 不重新制作镜像部署 1. 创…

Python简化远程部署和系统管理的工具库之fabric使用详解

概要 Python Fabric库是一个用于简化远程部署和系统管理的工具库。它提供了一组简洁而强大的函数和工具,可以帮助开发者轻松地在多台远程主机上执行命令、上传文件、下载文件等操作,从而实现自动化部署和管理。 安装 要使用Python Fabric库,首先需要安装Fabric模块。可以通…