该文章属于在YouTube视频上看到的,链接如下:

https://www.youtube.com/watch?v=EmDJsl7C9-k&t=3s

1.创建一个工程并建立一个控制台程序

2.Solution-->右键新建dll工程

3.Solution-->右键属性,选择依赖项,确定

4.CppClient-->右键设置属性$(SolutionDir)myLib\,inherit打勾,确定

5.VC++Directories-->Library Directories-->$(SolutionDir)$(IntDir)

6.myLib-->右键设置属性-->Command Line-->/DDLL_BUILD

7.myLib添加一个类,再添加一个头文件myLib.h

8.代码如下:

 1 #pragma once
2
3 #ifndef EXT_MYLIB
4
5 #ifdef DLL_BUILD
6 #define EXT_MYLIB __declspec(dllexport)
7 #else
8 #pragma comment(lib, "myLib.lib")
9 #define EXT_MYLIB __declspec(dllimport)
10 #endif
11
12 #endif
13
14
15 extern int EXT_MYLIB max_size;
16 extern int EXT_MYLIB sum(int a, int b);

myLib.h

 1 // myLib.cpp : Defines the exported functions for the DLL application.
2 //
3
4 #include "stdafx.h"
5 #include "myLib.h"
6
7 int EXT_MYLIB max_size = 100;
8
9 int EXT_MYLIB sum(int a, int b)
10 {
11 int s = 0;
12 for (int i = 0; i <= b; ++i)
13 s += i;;
14 return s;
15 }

myLib.cpp

 1 #pragma once
2
3 #include "myLib.h"
4
5 #include <iostream>
6
7 #include <sstream>
8
9
10 class EXT_MYLIB Vctr
11 {
12
13 private:
14
15 double m_x, m_y, m_z;
16
17 public:
18 Vctr();
19
20 Vctr(double i, double j, double k);
21
22 ~Vctr();
23
24 int Total(int a, int b);
25
26
27 std::string to_string() const
28 {
29 std::ostringstream os;
30 os << "(" << m_x << "," << m_y << "," << m_z << ")";
31
32 return os.str();
33 }
34 friend EXT_MYLIB std::ostream &operator<<(std::ostream &os, const Vctr &v);
35 friend void EXT_MYLIB TestFriend(const Vctr &v);//the usage of friend fucntion
36 };

Vctr.h

 1 #include "stdafx.h"
2 #include "Vctr.h"
3
4
5 EXT_MYLIB Vctr::Vctr()
6 {
7 }
8
9
10 EXT_MYLIB Vctr::~Vctr()
11 {
12 }
13
14
15
16 EXT_MYLIB Vctr::Vctr(double x, double y, double z): m_x(x) , m_y(y), m_z(z)
17 {
18
19 }
20
21
22 EXT_MYLIB std::ostream& operator<<(std::ostream& os, const Vctr& v)
23 {
24 os << v.to_string();
25
26 return os;
27 }
28
29 EXT_MYLIB void TestFriend(const Vctr& v)
30 {
31 std::cout << "hello, this is a friend function!" << std::endl;
32 std::cout << "m_x :" << v.m_x << std::endl;
33 }
34
35 EXT_MYLIB int Vctr::Total(int a, int b)
36 {
37 return (a+b);
38 }

Vctr.cpp

 1 #include "pch.h"
2
3 #include <iostream>
4
5 #include "myLib.h"
6
7 #include "Vctr.h"
8
9 int main()
10 {
11 Vctr v(2, 3, 4);
12 std::cout << v << std::endl;
13 std::cout << "sum is: " << sum(2, 3) << std::endl;
14 TestFriend(v);
15 std::cout << "max_size is: " << max_size << std::endl;
16 }

CppClient.cpp

总结:

1.该视频主要讲解了变量/函数/类如何打包成dll,发现宏("macro")的位置放置并没有严格限制,例如在myLib.h,对函数的声明我们可以这样:extern int EXT_MYLIB sum(int a, int b)或者

extern EXT_MYLIB int sum(int a, int b);

2.对于函数("function")而言,关键字extern可以去掉("variable"去掉extern会报错);

3.EXT_MYLIB放置于函数返回类型前可能会报warning[browsing operations around this macro may fail,consider adding it to hint file],但这看似并不影响dll的编译以及被调用。

4.类的成员函数(包括静态函数)定义时候可以不加EXT_MYLIB,这样类的实例化对象(类名可以直接访问类的公有静态函数)依旧可以正常引用成员函数(猜测可能是定义类时候已经加入EXT_MYLIB);

How to Create DLL(Dynamic link library)的更多相关文章

  1. [DLL] Dynamic link library (dll) 的编写和使用教程

    前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容 ...

  2. Walkthrough: Creating and Using a Dynamic Link Library (C++)

    Original Link: http://msdn.microsoft.com/zh-cn/library/ms235636.aspx Following content is only used ...

  3. DYNAMIC LINK LIBRARY - DLL

    https://www.tenouk.com/ModuleBB.html MODULE BB DYNAMIC LINK LIBRARY - DLL Part 1: STORY What do we h ...

  4. Walkthrough: Create and use your own Dynamic Link Library (C++)

    参考网站:https://docs.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-dynamic-link-librar ...

  5. How to Use the Dynamic Link Library in C++ Linux (C++调用Delphi写的.so文件)

    The Dynamic Link Library (DLL) is stored separately from the target application and shared among dif ...

  6. Custom Action : dynamic link library

    工具:VS2010, Installshield 2008 实现功能: 创建一个C++ win32 DLL的工程,MSI 工程需要调用这个DLL,并将Basic MSI工程中的两个参数,传递给DLL, ...

  7. 动态链接库(Dynamic Link Library)

    DLL INTRODUCTION A DLL is a library that contains code and data that can be used by more than one pr ...

  8. 动态链接库(Dynamic Link Library)学习笔记(附PE文件分析)

    转载:http://www.cnblogs.com/yxin1322/archive/2008/03/08/donamiclinklibrary.html 作者:EricYou 转载请注明出处   注 ...

  9. Linux Dynamic Shared Library && LD Linker

    目录 . 动态链接的意义 . 地址无关代码: PIC . 延迟版定(PLT Procedure Linkage Table) . 动态链接相关结构 . 动态链接的步骤和实现 . Linux动态链接器实 ...

随机推荐

  1. OPC UA分布式IO模块

    OPC UA IO模块对工业物联网的影响 OPC UA IO模块是指IO模块支持OPC UA协议,可以直接与OPC Client进行通信,这样就可以从OPC Client上直接远程通过以太网对IO口进 ...

  2. php static 和self区别

    static(关键字) 类似于 self(关键字) , 但它指向的是被调用的类(Document) 而不是包含类(DomainObject) , static 和 self 的区别: <?php ...

  3. 海纳百川无所不容,Win10环境下使用Docker容器式部署前后端分离项目Django+Vue.js

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_179 随着现代化产品研发的不断推进,我们会发现,几乎每个产品线都会包含功能各异的服务,而且服务与服务之间存在也会存在着错综复杂的依 ...

  4. SpringBoot定时任务 - 开箱即用分布式任务框架xxl-job

    除了前文介绍的ElasticJob,xxl-job在很多中小公司有着应用(虽然其代码和设计等质量并不太高,License不够开放,有着个人主义色彩,但是其具体开箱使用的便捷性和功能相对完善性,这是中小 ...

  5. 使用.NET简单实现一个Redis的高性能克隆版(二)

    译者注 该原文是Ayende Rahien大佬业余自己在使用C# 和 .NET构建一个简单.高性能兼容Redis协议的数据库的经历. 首先这个"Redis"是非常简单的实现,但是他 ...

  6. AgileFontSet迅捷字体设置程序

    AgileFontSet迅捷字体设置程序-用户手册  AgileFontSet的完整代码,参见 https://www.cnblogs.com/ybmj/p/11683291.html 1.程序特点和 ...

  7. 来看看这位年轻的 eBay 小伙是如何成为 Committer

    介绍一下我自己 目前就职于eBay中国,专注于微服务中间件,分布式架构等领域,同时也是狂热的开源爱好者. 如何成为一个commiter 过去几个月,我一直持续在为 Apache DolphinSche ...

  8. NC20471 [ZJOI2007]棋盘制作

    题目链接 题目 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名. 据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对 ...

  9. iNeuOS工业互联网操作系统,在航天和军工测控领域的应用

    目       录 1.      行业概述... 2 2.      解决方案... 2 3.      解决的痛点... 6 1.   行业概述 现在国际形势异常严峻,加大了偶发武装斗争的可能性. ...

  10. Word 段前分页是什么?怎么设置?

    描述 这两个标题在第一个标题的页中,且两个标题都没有独立分页.要让每一个标题独立分页,需要对标题的格式进行修改. 段前分页指的是标题与标题之间不在同一个页中,每一个标题都在独立的页中. 设置段前分页 ...