Dev C++开发lib和dll

原文地址:https://blog.csdn.net/u010411264/article/details/73195227

devc++ 版本为:Dev-Cpp_5.11_TDM-GCC_4.9.2_Setup

1 创建lib

1.1 首先创建一个文件夹test_lib。

1.2 再使用dev创建一个static Library项目,test_lib, 存放到test_lib文件夹下。

1.3 添加mylib1.h和mylib1.cpp

mylib1.h

#include<stdio.h>

#pragma once
#ifndef _functem_H
#define _functem_H
int print_my_name(int a, int b);
#endif

mylib1.cpp

#include "mylib1.h"

int print_my_name(int a, int b)
{
    printf("hello this is mylib1\n");
    printf("%d\n", a+b);
    return a+b;
}

按F9编译,生成了testlib.a

1.4 测试testlib.a,创建use_test_lib文件夹

1.5 创建use_test_lib的console Application项目,放到use_test_lib文件夹下

1.6 右键项目,在项目属性中添加linker

D:/c++/dev/test_lib/test_lib.a

在main.cpp中引用mylib1.h,进行测试

main.cpp

#include <iostream>
#include "D:/c++/dev/test_lib/mylib1.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
    print_my_name(1, 2);
    return 0;
}

2 创建dll

可能有用的链接:

LoadLibrary: https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibrarya

GetProcAddress: https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getprocaddress

Exporting from a DLL Using __declspec(dllexport):https://docs.microsoft.com/en-us/cpp/build/exporting-from-a-dll-using-declspec-dllexport?view=msvc-160

两种调用方式:https://blog.csdn.net/qq_29542611/article/details/86618902

2.1 首先创建test_dll和use_test_dll文件夹

2.2 创建test_dll, dll项目

自动生成了一个DllClass,我们先删掉,搞一个简单的函数

2.3 dll函数

首先在头文件声明这是一个c的,要导出使用的函数。

声明c有两种方法:

1

extern "C"

2

__cdecl

声明导出是:

__declspec(dllexport)

在dllmain.cpp中定义hello函数 按F11生产test_dll.dll。

同时可以发现还生产了对应的libtest_dll.a。

对应了两种调用dll的方式。

1 引用libtest_dll.a并把test_dll.dll放到使用这个dll的exe的同级目录下。

这样的好处是可以直接使用动态链接库中的函数,他会自动调用dll。方便。

2 只是用test_dll.dll, 此时需要动态加载dll,好处是不需要链接.a节约空间?

没测试,这里不太清楚。。。

2.4 创建use_test_dll项目

初始代码如下:

2.5 静态引用测试

我们先测试同时使用libtest_dll.a和test_dll.dll这种方法 链接时可以将dll写成绝对路径,不需要拿过来,但是运行的时候,就需要在同级寻找这个dll了,应该可以设置吧,但是我不懂。 测试结果:

main.cpp:

#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "D:/c++/dev/test_dll/dll.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
    hello();
    return 0;
}

2.6 动态引用测试

第二种方法,动态加载test_dll.dll不使用libtest_dll.a 测试结果:

main.cpp:

#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "D:/c++/dev/test_dll/dll.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

#pragma comment(lib,"D:/c++/dev/test_dll/libtest_dll.a")

extern "C" int add(int a, int b);

int main(int argc, char** argv) {

    // 运行时加载DLL库
    HINSTANCE module = LoadLibrary(TEXT("D:/c++/dev/test_dll/test_dll.dll"));
    if (module != NULL)
    {
        typedef int(*AddFunc)(int, int); // 定义函数指针类型
        AddFunc add;
        // 导出函数地址
        add = (AddFunc)GetProcAddress(module, "add");

        int sum = add(100, 200);
        printf("动态调用,sum = %d\n", sum);
    }
    else
    {
        printf("test_dll.dll动态库失败\n");
    }

    FreeLibrary(module);
    return 0;
}

2.7 dll中导出类

上边只简单测试了一个简单函数的dll,类与函数类似,只要声明为导出对象就可以了

dll.h

#include<stdio.h>
#include<string>
#include<iostream>
#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
#define DLLIMPORT __declspec(dllexport)
#else
#define DLLIMPORT __declspec(dllimport)
#endif


extern "C" class __declspec(dllexport) Student
{
    public:
        std::string name;
        int id;

        Student();
        Student(std::string name, int id);
        void Speak();
};


#endif

dllmain.cpp

/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>


Student::Student()
{
    ;
}
Student::Student(std::string name, int id)
{
    this->name = name;
    this->id = id;
}
void Student::Speak()
{
    std::cout<<this->id<<" "<<this->name<<std::endl;
}


BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
    switch(fdwReason)
    {
        case DLL_PROCESS_ATTACH:
        {
            break;
        }
        case DLL_PROCESS_DETACH:
        {
            break;
        }
        case DLL_THREAD_ATTACH:
        {
            break;
        }
        case DLL_THREAD_DETACH:
        {
            break;
        }
    }

    /* Return TRUE on success, FALSE on failure */
    return TRUE;
}

main.cpp

#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "D:/c++/dev/test_dll/dll.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
    Student *a = new Student("Bob", 19);
    a->Speak();
    return 0;
}
文章目录