windows系统下可执行程序调用lib静态库和dll动态库的方法

原创 2017年01月12日 10:38:08

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);  // 必须加前缀

#endif

添加*.cpp文件;
示例程序:
#include "stdafx.h"
#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;
}

方法二: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;
}




相关文章推荐

windows动态添加lib的三种方法

方法1: 通过设置工程配置来添加lib库.A、添加工程的头文件目录:工程—属性—配置属性—c/c++—常规—附加包含目录:加上头文件存放目录。B、添加文件引用的lib静态库路径:工程—属性—配置属性—...

Windows静态库和动态库的调用方法汇总

静态库的调用方法 第一种:项目设置中引用,在项目的属性中设置。 第二种:在代码中使用 #progma comment(lib,"lib文件名"); 第一种方法: 步骤一: 右键单击项目—>属...

window平台下动态库与静态库生成与使用(C++)

window平台下动态库与静态库生成与使用(C++)动态库动态库的生成vs的设置自行百度,废话不多讲,上代码:代码参考:http://blog.chinaunix.net/xmlrpc.php?r=b...

windows下动态链接库的使用(实例)

一、生成DLL   1.       新建DLL工程 在VS中,新建一个空的项目,选Win32 Console Application,新建完后修改工程属性:把生成EXE改为生成DLL   2.   ...

Windows平台下动态链接库的总结

1、 动态链接库与静态连接库        静态连接库与动态链接库都是经过编译器编译之后的,在计算机上可以直接运行的二进制目标文件,就像exe文件一样,但不同于exe文件的是静态链接库和动态链接库不...

Windows下VS2013创建与使用动态链接库(.dll)

**一、创建动态链接库文件** 1、打开VS2013,选择文件,新建工程 2、选择新建W32控制台应用程序,这里将工程名改为makeDLL 3、在应用程序类型中选择DLL,点击完成 4、完成以...
  • LZH2912
  • LZH2912
  • 2017年04月01日 17:27
  • 868

浅谈Windows平台下C++调用静态链接库的方式

浅谈Windows平台下C++调用静态链接库的方式1. 什么是静态链接库?为什么要用静态链接库?维基百科上关于静态库的解释是这样的:在计算机科学里,静态库(英语:Static library, Sta...

程序编译运行时头文件或动态链接库的查找

当考虑怎样总结这个头文件及动态链接库的查找问题时,我想到了一个程序从生到死的历程。写过很多程序,编译过很多程序,也运行过很多程序,对一个程序的从生到死,感觉很简单,也就没有做更多的或者说深入的思考与研...

java如何调用lib

JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J...
  • my8688
  • my8688
  • 2011年05月17日 00:00
  • 4275

Android在调用openCV时可以通过静态库调用,不需要libopencv_java.so库

Android在调用openCV时可以通过静态库调用,不需要libopencv_java.so库Android.mkLOCAL_PATH := $(call my-dir) OPENCV_PATH :...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windows系统下可执行程序调用lib静态库和dll动态库的方法
举报原因:
原因补充:

(最多只允许输入30个字)