zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    LeetCode 326. Power of Three
    LeetCode 324. Wiggle Sort II
    LeetCode 322. Coin Change
    LeetCode 321. Create Maximum Number
    LeetCode 319. Bulb Switcher
    LeetCode 318. Maximum Product of Word Lengths
    LeetCode 310. Minimum Height Trees (DFS)
    个人站点大开发!--起始篇
    LeetCode 313. Super Ugly Number
    LeetCode 309. Best Time to Buy and Sell Stock with Cooldown (DP)
  • 原文地址:https://www.cnblogs.com/YangARTuan/p/12002917.html
Copyright © 2011-2022 走看看