windows系统下可执行程序调用lib静态库和dll动态库的方法
来源:互联网 发布:淘宝宝贝详情图片排放 编辑:程序博客网 时间:2024/04/26 01:22
1、windows系统下可执行程序调用lib静态库的方法。
#pragma comment(lib,"Ws2_32.lib")//表示链接Ws2_32.lib这个库。
这种方法和在工程设置里写上链入Ws2_32.lib的效果一样,不过这种方法写的程序别人在使用你的代码的时候就不用再设置工程settings了。告诉连接器连接的时候要找ws2_32.lib,这样你就不用在linker的lib设置里指定这个lib了。
用法示例:
#include "Mwic_32.h"
#pragma comment(lib,"Mwic_32.lib")
包含对应的头文件和指定lib库,就不需要在project setting里面设置了,程序能自动引用Mwic_32.lib静态库文件。
2、windows系统下可执行程序调用dll动态库的方法。
dll 两种链接方式 : 动态链接和静态链接(链接亦称加载)
动态链接:指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。 动态链接是只建立一个引用的接口,而真正的代码和数据存放在另外的可执行模块中,在运行时再装入。
静态链接:就是把所有用到的函数全部链接到exe文件中。静态链接是把所有的代码和数据都复制到本模块中,运行时就不再需要库了。
(1)生成 :
静态链接库 lib 和动态链接库 dll;
新建工程 (newdll) win32项目 -> dll;
添加*.h文件 ;示例程序:
#ifndef BETABINLIB_H
#define BETABINLIB_H
#ifdef NEWDLL_EXPORTS //自动添加的宏 右键工程-属性-配置属性-预处理器-..定义
#define MYDLL_API extern "C" __declspec(dllexport)
#else
#define MYDLL_API extern "C" __declspec(dllimport)
#endif
MYDLL_API int add(int x, int y); // 必须加前缀
#define BETABINLIB_H
#ifdef NEWDLL_EXPORTS //自动添加的宏 右键工程-属性-配置属性-预处理器-..定义
#define MYDLL_API extern "C" __declspec(dllexport)
#else
#define MYDLL_API extern "C" __declspec(dllimport)
#endif
MYDLL_API int add(int x, int y); // 必须加前缀
#endif
添加*.cpp文件;
示例程序:
#include "stdafx.h"
#include "betabinlib.h"
int add(int x, int y)
{
return x + y;
}
#include "betabinlib.h"
int add(int x, int y)
{
return x + y;
}
编译生成 .dll 和 .lib文件。
(2)使用:
方法一:dll的静态加载--将整个dll文件 加载到 .exe文件中;
特点:程序较大,占用内存较大,但速度较快(免去调用函数LOADLIB等)
测试:
需要文件: .lib 和 .dll两个文件 (.lib 做 引导用),.h文件
示例程序:
#include <stdio.h>
#include <Windows.h>
#include "betabinlib.h"
#pragma comment(lib, "newdll.lib")
int main()
{
printf("2 + 3 = %d \n", add(2, 3));
return 0;
}
#include "betabinlib.h"
#pragma comment(lib, "newdll.lib")
int main()
{
printf("2 + 3 = %d \n", add(2, 3));
return 0;
}
方法二:dll的动态加载--根据需要加载响应函数,随时可卸载。不会因为找不到dll, 导致程序不能运行(需要自己做判断处理)。
只需要 .lib文件,不需要 .h文件。
#include <stdio.h>
#include <Windows.h>
int main()
{
HINSTANCE h=LoadLibraryA("newdll.dll");
typedef int (* FunPtr)(int a,int b);//定义函数指针
if(h == NULL)
{
FreeLibrary(h);
printf("load lib error\n");
}
else
{
FunPtr funPtr = (FunPtr)GetProcAddress(h,"add");
if(funPtr != NULL)
{
int result = funPtr(3, 3);
printf("3 + 3 = %d \n", result);
}
else
{
printf("get process error\n");
printf("%d",GetLastError());
}
FreeLibrary(h);
}
return 0;
}
#include <Windows.h>
int main()
{
HINSTANCE h=LoadLibraryA("newdll.dll");
typedef int (* FunPtr)(int a,int b);//定义函数指针
if(h == NULL)
{
FreeLibrary(h);
printf("load lib error\n");
}
else
{
FunPtr funPtr = (FunPtr)GetProcAddress(h,"add");
if(funPtr != NULL)
{
int result = funPtr(3, 3);
printf("3 + 3 = %d \n", result);
}
else
{
printf("get process error\n");
printf("%d",GetLastError());
}
FreeLibrary(h);
}
return 0;
}
0 0
- windows系统下可执行程序调用lib静态库和dll动态库的方法
- C++ 加载dll 及调用lib 和 dll的 方法 和 动态库DLL与静态库lib的区别
- C++ 调用Lib和Dll 的方法及 动态库DLL与静态库lib的区别
- C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别
- C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别
- vc调用动态链接库DLL和静态链接库Lib的四种方法
- windows和android调用第三方C++库(静态库lib、动态库dll)
- windows和android调用第三方C++库(静态库lib、动态库dll)
- Windows静态库和动态库的创建和使用 (lib vs dll)
- Windows静态库和动态库的创建和使用 (lib vs dll)
- 【Windows】 静态链接库和动态链接库,DLL的静态加载和动态加载,两种LIB文件。
- 静态库Lib和动态库Dll
- 静态库Lib和动态库Dll
- 静态库Lib和动态库Dll
- 静态库Lib和动态库Dll
- windows中静态库lib和动态dll的区别及使用方法
- 静态库和动态库的区别,lib文件和dll文件的配置方法
- 静态库和动态库的区别,lib文件和dll文件的配置方法
- 浮点转定点运算
- FL Studio录制面板使用教程
- Glide 一个专注于平滑滚动的图片加载和缓存库
- 笔试题4. LeetCode OJ (4) Fizz Buzz
- 2213: [Poi2011]Difference
- windows系统下可执行程序调用lib静态库和dll动态库的方法
- 二叉排序树
- ajax跨域
- Linux内核里的DebugFS
- spring component-scan
- 基于dragonboard 410c的智能魔镜设计——硬件搭建
- ArcGIS网络分析之构建网络分析数据集(一)
- 多线程之基础
- Caffe for Python 官方教程(翻译)