• How to Create 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

     

    总结:

    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);

  • 相关阅读:
    Installshield制作安装程序
    vista以上系统中开发的程序以管理员权限运行
    检查当前系统版本是否为Vista或更高的版本
    在程序运行过程中调用另一个程序
    Spin Control(旋转按钮控件、上下微调按钮控件)
    因改变工具栏图标导致菜单栏高度随之变大的解决方案
    Unicode环境下的字符差异
    注册表API
    文件的读写操作
    const char* 和 char* const
  • 原文地址:https://www.cnblogs.com/YangARTuan/p/12002917.html
Copyright © 2020-2023  润新知