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