当前位置: 首页 > news >正文

【VC++DLL动态链接库编程】VC++静态库编译(3)

在讲解动态库之前,先讲一个静态库的例子,使我们对库有一个概念。

在E:\core\src\目录下,创建一个静态库(库工程):

菜单栏:文件-->新建-->项目,如图所示:




此时为一个空静态库,如图所示:


首先添加一个类:菜单栏: 项目-->添加类-->C++类, 出现如下图示,在添加类名:Person,后面的.h文件和.cpp文件名会自动出现,无需人工填写。


点击完成之后,在头文件下面出现Person.h和源文件下Person.cpp。如图所示:



这里只做演示:在.cpp文件下,添加以下三句话,前两句为引用:


编译一下staticLib,即菜单栏:生成-->生成解决方案(B),则生成了静态库,如下所示:


此时我们来改变输出目录路径,即编译后的.lib文件所在的路径。在staticLib项目处右击属性,把输出点到库管理,或者改变常规,如图所示:


确定之后,core目录下,即与src同一级目录下出现lib文件,如图所示:


再重新编译staticLib,如图所示:


到此为止,静态库(库工程)编译成功,创建了一个静态库,得有一个(应用工程)程序去调用它。现在我们再新建一个项目,调用这个库,即把这个静态库应用起来。(讲库工程和应用工程放在同一个VC目录下,即在E:\core\src\)

新建一个应用工程(调用静态库)的项目:

文件-->新建-->项目,弹出如下图示:




在.cpp文件下,添加#include “Person.h”,将Person.h文件引用进来,如图所示:


红斜杠,表示找不到Person.h的头文件,此处是声明,若是编译的话,就会报错,如图所示:

解决办法,就是对TestStatic进行属性配置,即在TestStaitic项目处右击,选择属性,弹出如下图:


编译,即生成-->生成解决方案(B),此时开始如下错误:


报错显示:找不到Person的构造函数和析构函数。所以需要链接到Person的定义,即链接到Person的定义文件。如下:



设断点调试看看效果:


点击“本地Windows调试器”,进行调试,其结果如下:


静态库的引用:除了项目设置中的属性进行引用;还可以选择通过代码进行引用,即通过预编译的指令:#pragma comment(lib,"staticLib")这段代码只能放在cpp或c文件中,不能放在.h文件中,以防多次引用。


执行文件(.exe)会变大,因为静态库都会被引用过来,而且在执行的时候不再需要原来的库了。静态库直接编译到执行文件中。

添加两句话,我们来演示一下效果:


编译TestStatic,将静态库编译到exe文件里,然后双击.exe文件,如图所示的红框:


效果如图所示:


总结:

从上面的例子至少使我们明白,静函数到底是什么回事,对库有一个模糊认识:

(1)编写库的程序和一般的程序没有什么大的区别,只是库程序不能单独执行;

(2)库提供一些可以给别的程序调用的东东,别的程序要调用必须以某种方式指明它要调用之。


以上从静态链接库分析而得到的对库的概念,可以直接引申到动态链接库中,动态链接库与静态链接库在编写和调用上的不同体现在库的外部接口定义及调用方式稍有些差异。

相关文章:

  • 【VC++DLL动态链接库编程】DLL动态链接库创建(4)
  • 【VC++DLL动态链接库编程】教程目录(1)
  • 【人脸检测】Adaboost+Haar目录
  • 【python】List与string转化--test_veh.py代码
  • 临时需要用的网址 caffemodel
  • 【tensorflow学习笔记001】开篇:以实例了解tensorflow的运行与下载安装
  • 【深度学习:CNN】过拟合、梯度弥散、batchsize的影响的问题
  • 【深度学习:CNN】误差分析
  • 【深度学习:CNN】利用随机前馈神经网络生成图像观察网络复杂度
  • 【caffe使用记录】caffe的train和test网络model
  • 【tensorflow1.0学习笔记002】tensorflow中的概念
  • 【tensorflow1.0学习笔记003】构造神经网络与结果可视化代码
  • 【tensorflow1.0学习笔记004】TensorBoard可视化助手
  • 【tensorflow1.0学习笔记005】dropout解决overfitting
  • 【tensorflow1.0学习笔记007】实现简单的CNN卷积神经网络
  • 【Amaple教程】5. 插件
  • canvas绘制圆角头像
  • co.js - 让异步代码同步化
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React-flux杂记
  • React中的“虫洞”——Context
  • 多线程 start 和 run 方法到底有什么区别?
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 关于使用markdown的方法(引自CSDN教程)
  • 欢迎参加第二届中国游戏开发者大会
  • 设计模式走一遍---观察者模式
  • 算法之不定期更新(一)(2018-04-12)
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 网络应用优化——时延与带宽
  • 温故知新之javascript面向对象
  • 我从编程教室毕业
  • 正则表达式
  • HanLP分词命名实体提取详解
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • # 透过事物看本质的能力怎么培养?
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (12)Hive调优——count distinct去重优化
  • (2022 CVPR) Unbiased Teacher v2
  • (Java数据结构)ArrayList
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (十) 初识 Docker file
  • (十一)c52学习之旅-动态数码管
  • (五)网络优化与超参数选择--九五小庞
  • (转)人的集合论——移山之道
  • .mysql secret在哪_MySQL如何使用索引
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例