How to Creat DLL(Dynamic link library)

该文章属于在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

总结:

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

extern EXT_MYLIB int sum(int a, int b); 设置去掉extern也可以("variable"去掉extern会报错),EXT_MYLIB放置于函数返回类型前可能会报warning[browsing operations around this macro may fail,consider adding it to hint file],但这看似并不影响dll的编译以及被调用。

原文地址:https://www.cnblogs.com/YangARTuan/p/12002917.html

时间: 2024-11-06 03:51:56

How to Creat DLL(Dynamic link library)的相关文章

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

前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容比较多: http://www.tutorialspoint.com/dll/index.htm http://www.tuicool.com/articles/ZVBnE3b http://www.cnblogs.com/cswuyg/archive/2011/10/06/DLL2.html 第三

注意 electron 的 Error: A dynamic link library (DLL) initialization routine failed

把dll的load放在Electron中,就会报一个错: Error: A dynamic link library (DLL) initialization routine failed 这显然就是dll没有加载成功,为什么在Node中已经试过没问题的方法会在Electron中出问题,我此刻内心是惶恐的,因为Electron是我们最终的javascript运行容器,如果这种加载外部库的方式不可用,那意味着之前的一些技术方案都要重来,怀着忐忑的心情,我搜了一下,好在有非常贴合的问题并有相当具体的

Custom Action : dynamic link library

工具:VS2010, Installshield 2008 实现功能: 创建一个C++ win32 DLL的工程,MSI 工程需要调用这个DLL,并将MSI工程中的两个参数,传递给DLL, 参数1:Property 表中的 ProductName 参数2:操作 MSI 工程的 installer database 的 Handle 对参数1的操作:通过对话框的方式显示出来. 对参数2的操作:读取 Property 表中的 ProductName 属性,通过对话框的方式显示出来. 步骤一.VS20

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

转载:http://www.cnblogs.com/yxin1322/archive/2008/03/08/donamiclinklibrary.html 作者:EricYou 转载请注明出处 注:本文所写的动态链接库指传统的DLL,并非是.NET中的Assembly. 我对动态链接和动态链接库的概念并不陌,但一直以来就停留在概念的层面上,没有更深入的了解.今天抽空看了一下有关动态链接和动态链接库的文章,有了一些新的认识,当然不能忘了写在这里.那么现在就开始... 什么是动态链接和动态链接库  

no sigar-amd64-winnt.dll in java.library.path 错误

需要维护别人写的一个WEB项目,还原数据库,从SVN中检出源码,运行,提示如下错误: 5526 [localhost-startStop-1] DEBUG Sigar  - no sigar-amd64-winnt.dll in java.library.path org.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in java.library.path  at org.hyperic.sigar.Sigar.loadLibra

java.lang.UnsatisfiedLinkError:no dll in java.library.path终极解决之道

 Java调用Dll时,会出现no dll in java.library.path异常,在Java Project中不常见,因为只要将Dll拷贝到system32目录下即可:         但若是在Web Project中则经常遇见,因为Web Project引用的 java.library.path  有两处(jre的bin目录和Tomcat的bin目录) 因此解决方法如下: 1.在项目中执行System.out.println(System.getProperty("java.libra

1 [main] DEBUG Sigar - no sigar-amd64-winnt.dll in java.library.path org.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in java.library.path

github上一个java项目,在myeclipse中运行正常,生成jar后,运行报错: 1 [main] DEBUG Sigar - no sigar-amd64-winnt.dll in java.library.pathorg.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in java.library.path 原因:JAVA运行库缺sigar-amd64-winnt.dll 在myeclipse中运行正常,原来项目中有si

Linux Programe/Dynamic Shared Library Entry/Exit Point &amp;&amp; Glibc Entry Point/Function

目录 1. 引言 2. C/C++运行库 3. 静态Glibc && 可执行文件 入口/终止函数 4. 动态Glibc && 可执行文件 入口/终止函数 5. 静态Glibc && 共享库 入口/终止函数 6. 动态Glibc && 共享库 入口/终止函数 1. 引言 0x1: glibc Any Unix-like operating system needs a C library: the library which defines t

gcc dynamic load library

Linux下一般都是直接在编译生成时挂接上链接库,运行时,把链接库放到系统环境里就可以了 但是windows出现带来了动态链接的概念,也就兴起了非windows世界的插件的概念的范潮 对应于windows下的 LoadLibrary GetProcAddress FreeLibrary Linux提出了 dlopen dlsym dlclose 的相关系统调用 哎,全是抄啊!!!! 一把泪 好了,我想你应该明白怎么回事了吧 下面,带你进入linux动态加载库的世界 这个是由libdl库来运作的噢