【C/C++】VS2019下C++生成DLL并且成功调用(金针菇般细)

news2024/11/26 0:29:15

目录

一,生成动态链接库

二,使用动态链接库


一,生成动态链接库

1.打开VS2019,创建新项目,选择 动态链接库(DLL) 模板后进行下一步

2.输入项目名称,其它默认就行(可自行选择),点击创建

3 工程界面架构默认显示如下

4.右键工程名,点击 添加—>新建项,选择 C++类 并输入类名,点击添加,在添加类页面直接点击确定即可

5.在新添加 demoDLL.h 头文件中测试如下代码

#pragma once
#include <iostream>
//__declspec(dllexport)作用:告诉编译器和链接器被它修饰的类,函数或变量生成DLL后,能被外界调用
#define LIBRARY_API __declspec(dllexport)

#ifdef __cplusplus
extern "C"	//指示编译器这部分代码按C语言的进行编译,而不是C++的,能够正确实现C++代码调用其他C语言代码
{
#endif

	LIBRARY_API void One();
	LIBRARY_API int Two(int a, int b);
	void Three();	//未加 LIBRARY_API,调用DLL是否能使用全局函数

	class LIBRARY_API A {
		//测试在类名称前加 LIBRARY_API,调用DLL是否能使用类内成员
	public:
		void Four();
		static void Five();
	};

	class B {
		//测试在类名称前不加 LIBRARY_API,而是在类内个别函数加 LIBRARY_API,调用DLL是否能使用类内成员
	public:
		LIBRARY_API void Six();
		static void Seven();
	};

#ifdef __cplusplus
}
#endif // __cplusplus

6.在新添加 demoDLL.cpp 源文件中测试如下代码

#include "pch.h"
#include "TestDLL.h"

void One()
{
    std::cout << "DLL_函数接口:One()" << std::endl;
}

 int Two(int a, int b)
{
    std::cout << "DLL_函数接口:Two()" << std::endl;
    return a + b;
}

void Three()
{
    std::cout << "DLL_函数接口:Three()" << std::endl;
}

void A::Four()
{
    std::cout << "DLL_A类成员函数接口:Four()" << std::endl;
}

void A::Five()
{
    std::cout << "DLL_A类成员静态函数接口:Five()" << std::endl;
}

 void B::Six()
{
    std::cout << "DLL_B类成员函数接口:Six()" << std::endl;
}

void B::Seven()
{
    std::cout << "DLL_B类成员静态函数接口:Seven()" << std::endl;
}

7.右击工程名称,选择生成,然后会在工程目录Debug目录下生成 dlllib 库文件(可自行选择Debug模式还是Release模式,32位还是64位

二,使用动态链接库

1.将生成 CreateDLL.dll,CreateDLL.lib 拷贝一份到新建的 DLL/lib 目录下,将生成动态库的所有头文件 framework.h,pch.h,demoDLL.h 拷贝一份到新建的 DLL/include 目录下

2.新建一个工程(名称:userDLL)来测试该动态链接库,在项目属性页窗口进行配置

3.并在链接器的输入下,附加依赖项指定加载的动态库对应的lib文件

4.新建cpp文件并编写如下测试代码,另外也验证一下 __declspec(dllexport)

#include <iostream>
using namespace std;
#include "demoDLL.h"

int main()
{
	One();
	std::cout << Two(21, 25) << std::endl;
	//Three();//编译不通过:说明全局函数未加 __declspec(dllexport) 声明不能被外部调用

	A a;
	a.Four();
	A::Five();

	B b;
	b.Six();
	//B::Seven();//编译不通过:进一步说明只要未加 __declspec(dllexport) 声明就不能被外部调用

	return 0;
}

5.但这里运行报了如下错误,解决办法是将 CreateDLL.dll 拷贝一份到该工程目录下就行

6.最后运行成功了,大功告成!!!

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

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

相关文章

hive开窗函数

hive开窗函数 窗口函数 数据准备 1 jx 20 2 zx 24 3 yx 18 4 wz 10 5 yy 34 6 wy 25create table t (> id int,> name string,> age int> )> row format delimited fields terminated by ; load data inpath /data/data.txt into table t;ROW_NUMBER ROW_N…

网上订餐项目(含后台管理界面)

项目开发环境 项目使用IDEA 2018.3.5进行开发。Maven版本为 3.6.2。Tomcat版本为 8.5.42。数据库为mysql 5.7。JDK版本为1.8_211。项目使用SpringSpringMVCMybits框架。 点餐前台功能 登陆界面如下 登陆后可添加菜品到餐车 餐车里可查看添加的菜品 提交后可查看已派送和未…

Zookeeper配置化中心

zookeeper的基本知识 zookeeper的数据结构:zookeeper提供的命名空间非常类似于标准的文件系统&#xff0c;key-value的形式存储&#xff0c;名称key由/分割的一系列路径元素&#xff0c;zookeeper名称空间中的每个节点都是一个路径标志。 windows下的zookeeper安装&#…

使用Docker快速部署ES单机

所有的操作都是基于Docker来的&#xff0c;没有装Docker的话请参照官方文档安装单机环境部署初始化相关目录mkdir -p /usr/local/elasticsearch/{config,plugins,data}准备配置文件vim /usr/local/elasticsearch/config/elasticsearch.yml将下面的内容粘贴到elasticsearch.yml#…

训练一个中文gpt2模型

前言 这是我的github上的一个介绍&#xff0c;关于如何训练中文版本的gpt2的。链接为: https://github.com/yuanzhoulvpi2017/zero_nlp 介绍 本文&#xff0c;将介绍如何使用中文语料&#xff0c;训练一个gpt2可以使用你自己的数据训练&#xff0c;用来&#xff1a;写新闻、…

linux中top命令分析

TOP命令是 比较常用的性能分析命令&#xff0c;可以看出服务器CPU 、负载、内存、磁盘、IO等数值&#xff0c;接下来就详细解读top命令 top命令 打开服务器终端&#xff0c;直接输入top&#xff0c;top命令中的数据显示的都是当前的实时数据 直接这样输入&#xff0c;回车即…

iptables防火墙屏蔽指定ip的端口

因为需要测试客户端程序与hadoop服务器之间正常通信需要开通的端口, 所以在hadoop各服务器上使用iptables防火墙屏蔽了测试客户端程序的ip和所有端口。然后&#xff0c;根据报错信息提示的端口号来逐步放开直到能正常通信下载文件。 在服务器端屏蔽指定ip访问所有端口 #查看…

UUID的弊端以及雪花算法

目录 一、问题 为什么需要分布式全局唯一ID以及分布式ID的业务需求 ID生成规则部分硬性要求 ID号生成系统的可用性要求 二、一般通用方案 &#xff08;一&#xff09;UUID &#xff08;二&#xff09;数据库自增主键 &#xff08;三&#xff09;Redis生成全局id策略 三…

与AI相遇 | 在ChatGPT中输入“情人节”,我们会得到......?

最近ChatGPT可谓是风靡全球&#xff0c;大家彼此的问候从“你吃饭了吗”变成“你玩ChatGPT了吗”。这款当今最火爆的AI语言模型&#xff0c;是美国人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理工具&#xff0c;使用了Transformer神经网络架构&#xff…

校园创新创业基地管理系统(java,jsp,ssh,mysql)+全套视频教程

技术栈: JAVA,SSH, MYSQL, JQUERY,HTML,CSS, JAVASCRIPT首页访问 http://localhost:8080/Struts2.3.16.1Hibernate4.3.4Spring4.0.2/index_index.action管理员admin 123456用户 user1 123456代码功能演示&#xff1a; http://woc.xin/8C64kZ功能列表:本系统包含普通用户,后台管…

LeetCode(Java)—— 加一(简单)

加一概述&#xff1a;给定一个由整数组成的非空数组所表示的非负整数&#xff0c;在该数的基础上加一。最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。输入&#xff1a;digits [1,2,3] …

如何设计一个API接口?

在日常开发中&#xff0c;总会接触到各种接口。前后端数据传输接口&#xff0c;第三方业务平台接口。一个平台的前后端数据传输接口一般都会在内网环境下通信&#xff0c;而且会使用安全框架&#xff0c;所以安全性可以得到很好的保护。这篇文章重点讨论一下提供给第三方平台的…

Python readline()和readlines()函数:按行读取文件

如果想读取用 open() 函数打开的文件中的内容&#xff0c;除了可以使用 read() 函数&#xff0c;还可以使用 readline() 和 readlines() 函数。和 read() 函数不同&#xff0c;这 2 个函数都以“行”作为读取单位&#xff0c;即每次都读取目标文件中的一行。对于读取以文本格式…

基于JAVA+SpringBoot+VUE的心理健康测试系统的设计与实现

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着现代社会的不断发…

写给小白,Python 爬虫学习思路

爬虫是Python是一个很经典的方向&#xff0c;大多数的小伙伴看到的是Python爬虫的就业效果&#xff0c;确实Python爬虫学习成本低&#xff08;学习快&#xff09;&#xff0c;就业效果好&#xff0c;特别适合新手入门&#xff0c;但是也要关注另外一个点&#xff0c;就是Python…

iTerm2 + Oh My Zsh 打造舒适终端体验

最终效果图&#xff1a; 因为powerline以及homebrew均需要安装command line tool&#xff0c;网络条件优越的同学在执行本文下面内容之前&#xff0c;可以先安装XCode并打开运行一次&#xff08;会初始化安装components&#xff09;&#xff0c;省去以后在iterm2中的等待时间。…

LeetCode 234. 回文链表 | C语言版

LeetCode 234. 回文链表 | C语言版LeetCode 234. 回文链表题目描述解题思路思路一&#xff1a;使用快慢双指针代码实现运行结果参考文章&#xff1a;[https://leetcode.cn/problems/palindrome-linked-list/solutions/1011052/dai-ma-sui-xiang-lu-234-hui-wen-lian-bia-qs0k/?…

这几款高效办公神器,职场大神都在用(建议收藏)

都快2023年了&#xff0c;还不知道怎么用网站来提高工作和生活质量&#xff1f;还不快搬好小板凳&#xff0c;听我来安利这几个实用网站&#xff01; 一、做图神器 1.创可贴&#xff1a;国内最火的在线设计工具 链接&#xff1a;https://www.chuangkit.com/designtools/desi…

基于深度学习的三维重建(一):三维重建简介、patchmatchNet环境部署、用colmap如何测试自己的数据集

目录 1.什么是三维重建 2.MVS是什么 3.传统MVS的局限性和为什么基于深度学习的MVS性能好于传统三维重建 4.基础概念 5. patchmatchNet环境配置 6.如何测试自己的数据集&#xff08;位姿计算&#xff09; 6.1 colmap导出位姿 6.2 将colmap位姿转换成MVS读取的数据格式 1.…

Linux安装Docker配置docker-compose 编排工具【超详细】

一、介绍Docker Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有…