栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Visual Studio-编写C++链接库

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Visual Studio-编写C++链接库

静态链接库:lib

建立头文件testlib.h--建立源文件testlib.cpp

testlib.h

#ifndef TESTLIB_H

#define TESTLIB_H

//防止头文件重复包含

//条件编译指令

//加减乘除

int add(int a,int b);

#endif

testlib.cpp

#include "testlib.h"

//加减乘除

int add(int a,int b)

{

     return a+b;

 }  

在VS里面点击生成-解决方案(静态库已经开发好了)

在testlib/Debug目录下,生成testlib.lib(二进制代码)

lib,库文件不能独立运行

新建一个项目,建立源文件test.cpp

#include

//解决方案testlib中有两个项目,分别是test和testlib

#include "../testlib/testlib.h"//上一级目录下

//右击项目-属性-连接器-常规-附加库目录-写相对路径(包含testlib.lib)

#pragma comment(lib,"testlib.lib")

int main()

{

  printf("请输入两个整数,计算当前两个整数的和n");

  int a,b;

  scanf("%d%d",&a,&b);

  //调用一下静态库

  printf("add(a,b)=%dn", add(a,b));

  reutrn 0;

}

进行打包发布,新建文件夹,在文件夹下面新建include文件夹(包含头文件),lib文件夹(包含lib文件)

动态链接库:dll

需要工具-百度-www.dependencywalker.com-x64是64位的,x86是32位的

静态库将所有lib组合到exe中,容易造成exe过大

动态库,动态加载,利于软件升级,联网-下载-替换-重启

头文件testdll.h-源文件testdll.cpp

testdll.h

#ifndef TESTDLL_H

#define TESTDLL_H

int add(int a,int b);

#endif

testdll.cpp

#include"testdll.h"

int add(int a,int b)

{

  return a+b;

}

动态库不能独立运行,可以按Ctrl+f,会显示无法运行程序,不过没有问题

或者右键项目-重新生成

在testdll/Debug目录下,testdll.dll

将testdll.dll往Dependency里面一拖

例子:在c盘里面有kernel32.dll,有一些api的接口(线程进程),操作系统核心的动态库还有user32.dll,gd32.dll。

在testdll.h里面添加

testdll.h

#ifndef TESTDLL_H

#define TESTDLL_H

//条件编译指令

//右击项目-属性-配置属性-c/c++-预处理器-预处理器宏定义-加上_DLLAPI

#ifdef _DLLAPI

//同时生成了testdll.lib和testdll.exp

  #define DLLAPI _declspec(dllexport) 

#else 

  #define DLLAPI _declspec(dllimport) 

#endif

//声明导出函数,使用c语言的方式来进行编译

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

#endif

动态库是使用

新建一个项目,建立源文件test.cpp

#include

#include "../testdll/testdll.h"

//右击项目-属性-连接器-常规-附加库目录-写相对路径(包含testdll.dll)

//导入

//#pragma comment(lib,"testdll.lib")//这个不是真正的静态库,隐式调用动态库

//显示调用静态库

#include

typedef int (*PADD)add(int a,int b);//函数指针

int main()

{

  printf("请输入两个整数,计算当前两个整数的和n");

  int a,b;

  scanf("%d%d",&a,&b);

  //显示调用动态库,在需要的时候用

  //加载一下dll文件

  HMODULE hDLL = LoadLibrary(L"../Debug/testdll.dll");

  if(hDLL==NULL)

 {

    printf("加载DLL文件失败。n");

    return 0;

  }

  //导出函数,获取函数的指针

  //c语言的动态库,是原来的名称,但cpp会改变

  //为了防止编译器把导出接口改名字,需要更改testdll.h文件

  PADD pAdd=(PADD) GetProcAddress(hDLL,"add");

  printf("add(a,b)=%dn", add(a,b));

  FreeLibrary(hDLL);

  reutrn 0;

}

有模块定义文件:使用原始头文件-右键项目-重新生成

右键项目-添加-新建项-代码-def文件

LIBRARY testdll

EXPORTS 

add

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033280.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号