Visual Studio引入外部库 ---- 弄懂静态库lib和动态库dll

这两天由于想要研究一下socket的相关内容,但是没想到引入外部库还有这么多门道。

根据维基百科定义:一个现代编译器的主要工作流程如下:源代码(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→ 目标代码(object code)→ 链接器(linker)→ 可执行文件(executables),最后打包好的文件就可以给计算机去判读运行了。所谓的IDE(集成开发环境)不过是把这些步骤集成到一起,程序员可以专注于代码实现。


.cpp文件编译过程

以hello.cpp文件为例,编译执行这个文件需要经过一下几个步骤:

  1. 预处理:执行gcc -E hello.cpp > hello.i对.cpp文件进行预处理,产出hello.i文件(由于这个文件不可以直接看到的,所以我对指令增加了重定向>
  2. 编译:执行gcc -S hello.cpp对.cpp文件进行编译,将高级语言转换成汇编语言,产出hello.s文件
  3. 汇编:执行gcc -c hello.cpp将汇编指令转换成机器语言,产出hello.o目标文件(二进制)
  4. 链接:执行gcc hello.cpp -o hello将一个或多个由编译器或汇编器生成的目标文件和外部库链接为一个可执行文件,产出hello.exe文件

C/C++编译过程

静态库

是一个外部函数与变量的集合体。静态库的文件内容,其内容不像动态链接库那么复杂,在编译期间由编译器与链接器将它直接集成至应用程序内,并产出目标文件以及可以独立运作的可执行文件。Windows下静态库库为.lib后缀,在linux下为.a后缀。

动态库

是一个包含可由多个程序同时使用的代码和数据的库。DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数,并且允许进程可以共享调用。Windows下动态库为.dll后缀,在linux下为.so后缀。
由于C/C++的语言特性,所有的函数必须先声明再调用,所有单纯的动态库是无法被直接调用的,而导出库的作用就是用来包含动态库中所有的的函数声明。导出库虽然与静态库都是.lib文件,但是二者内容并不相同。

区别

相比于静态库直接集成到应用程序中,动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,不使用的时候再从内存释放。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。

Visual Studio引入

在VS工程中,在C/C++工程中引入外部库的基本步骤:

  1. 配置所有:右键工程根目录→ 属性 → 最上面修改为“所有配置”、“所有平台”
  2. 添加头文件目录:右键工程根目录→ 属性 → C/C++ → 常规 → 附加包含目录,添加include目录。
  3. 添加lib静态库:右键工程根目录 → 属性 → 链接器 → 常规 → 附加库目录,添加lib目录。
    添加工程引用的lib文件名:工程 → 属性 → 链接器 → 输入 → 附加依赖项:输入lib文件名。
    注意:有时候lib下并非实际的静态库,针对不同版本还要继续找在这里插入图片描述
  4. 添加dll动态库:把引用的dll放到工程的可执行文件所在目录即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爆破linux密码 $6$3uwqC9JI$d9iPRmTDAoXs/IbsplxS3iyeErHqw7fUycacXNHyZk1UCSwFEydl515/zXN7OEwHnyUaqYcNG...

1 #!/usr/bin/env python2 # -*- coding:UTF-8 -*-3 4 import crypt5 import sys6 7 # 哈希密码的前两位就是盐的前两位,这里我们假设盐只有两位。8 # 程序分两部分,一部分是打开字典,另一部分是哈希匹配密码9 10 #standard DES, two salt 1…

[G星计划]--项目开发总结

第一轮:Dr.Mech 参加了为期7天的第一轮DEMO竞赛,最佳团队,总结一下开发过程中的一些要点。 问题: 关于项目时间安排,由于项目核心代码量并不算太多,所以前几天还是比较从容的,不过这也导致许多…

使用BeanUitls提高对象拷贝效率

首先来创建两个bean 注:一定要有set/get方法,成员变量必须要同名 public class User1 {String name;String password;String phone; /**省略get/set方法**/ } public class User2 {String name;String password;String phone; /**省略get/set方法**/ } 1.Spring的Be…

机器字长、存储字长、指令字长

机器字长:CPU一次能处理数据的位数,一般等于CPU的寄存器位数。 存储字长:存储器中一个存储单元(存储地址)所存储的二进制代码的位数,即存储器中的MDR的位数。 指令字长:计算机指令字的位数。

var let this的区别

var xx; function test(){ var aa; //声明一let bb; //声明二this.cc; //声明三 //声明一局部代码块{let dd; //声明四 } }那么,这三种方式有什么区别呢? 区别在于作用域不…

在2020年学习cocos游戏引擎

常用链接 Cocos2d-x 用户手册 参考书目 《Cocos2d-X游戏开发实战精解》 《我所理解的Cocos2d-x》 《Effective C》中文版第三版 环境搭建 macOS 10.15.6 Xcode 11.5 cocos2d-x 3.17.2 cmake 3.17.3 创建工程 采用cocos2d-x 3.17版本可直接通过cocos console创建&#xf…

gdb调试程序

编译的时候需要加上 -g 选项。 gcc -o program -g main.c 执行的时候用 gdb 执行。 gdb ./program 常用命令 l 5, 列出从5行开始的前10行代码 b 6, b fun , 设置断点,参数可以是代码行号或者函数名 r , 运行 p, 运行暂停时,可以用 p expression 输出表…

[源码学习]--UGUI

学习参考 从bitbucket上获取uGUI 2019.1源码 UGUI内核大探究 事件系统 UnityEngine.UI/EventSystem/EventSystem.cs private List<BaseInputModule> m_SystemInputModules new List<BaseInputModule>(); // 系统输入模块列表 private BaseInputModule m_Curr…

PureMVC在Unity游戏开发中的应用

作为开发人员&#xff0c;我们都想写出优雅的代码&#xff0c;可又苦于自身能力不知该如何下手&#xff0c;而框架的作用正在与能够让你规范的去开发。 之前写Web的时候&#xff0c;总被要求采用MVC架构&#xff0c;的确非常好用&#xff0c;也从来没有质疑过这种架构的好与不好…

Lua热更新学习

在游戏开发中&#xff0c;常采用Lua进行热更新&#xff0c;本文主要记录lua学习过程中的知识点 Lua框架选择腾讯维护的xLua进行学习 lua语法 Lua中文文档 常用tips // 无需结尾;分号 // nil 表示回收内存 // type() 获取类型 // 单行注释 -- // 多行注释 --[[]]-- // 字符串…

3栏布局技巧

流体布局 主要内容无法优先加载&#xff0c;影响用户体验 html结构&#xff0c;left,right&#xff0c;center&#xff0c;主要内容无法优先加载 <div class"container1"><div class"col_left">left</div> <div class"col_r…

[读书笔记] Effective C++

部分条款过于深奥&#xff0c;部分条款已了然于心&#xff0c;仅记录当下所识所学 条款02&#xff1a;尽量以const&#xff0c;enum&#xff0c;inline替换#define 对于常量宏定义&#xff0c;最好用const代替#define 对于函数宏定义&#xff0c;最好用inline代替#define #inc…

Unity资源管理--AssetBundle学习

Unity资源目录 当用Unity创建一个工程的时候&#xff0c;目录如下&#xff1a; Assets&#xff1a;存放Unity工程实际的资源目录。 Library&#xff1a;存放Unity处理完毕的资源&#xff0c;由unity自动转化生成。 Log&#xff1a;存放日志文件。 Packages&#xff1a;统一管…

[读书笔记] 设计模式与游戏完美开发

最近在看《设计模式与游戏完美开发》&#xff0c;文章将记录一些要点和一些设计模式实现 GoF定义的23种设计模式及应用场景 系统设计可以采用的设计模式&#xff1a;单例、状态&#xff08;场景切换&#xff09;、外观&#xff08;保证高内聚&#xff09;、中介者&#xff08…

auto关键字

使用前&#xff1a; #include<string> #include<vector> int main() {std::vector<std::string> vs;for (std::vector<std::string>::iterator i vs.begin(); i ! vs.end(); i){//...} } 使用后&#xff1a; #include<string> #include<vect…

[读书笔记] 代码整洁之道

书的示例是Java语言编写的&#xff0c;虽说不会影响阅读&#xff0c;但是后面几章讲应用这套方法论的时候&#xff0c;大篇幅的Java代码分析还是挺难受的&#xff0c;而且连java测试框架Junit都要细讲&#xff0c;对于非Java系的开发者来说&#xff0c;一些内容确是云里雾里。 …

iOS开发——GPUImage源码解析

一、基本概念 GPUImage&#xff1a;一个开源的、基于openGL的图片或视频的处理框架&#xff0c;其本身内置了多达120多种常见的滤镜效果&#xff0c;并且支持照相机和摄像机的实时滤镜&#xff0c;并且能够自定义图像滤镜。同时也很方便在原有基础上加入自己的滤镜Filter&#…

[读书笔记] 敏捷软件开发:原则、模式与实践

关于面向对象编程的一些理解&#xff0c;这本书主要看六大原则的部分&#xff0c;书中关于设计模式的内容由于之前的那本《设计模式与游戏完美开发》已经很好的讲解了游戏开发领域的应用&#xff0c;所以不多关注。 面向对象的六大原则 单一职责原则SRP&#xff1a;一个类应该…

Caffe-SSD相关源码说明和调试记录

1 对Blob的理解及其操作&#xff1a; Blob是一个四维的数组。维度从高到低分别是: (num_&#xff0c;channels_&#xff0c;height_&#xff0c;width_) 对于图像数据来说就是&#xff1a;图片个数&#xff0c;彩色通道个数&#xff0c;宽&#xff0c;高 Blob中数据是row-…

[游戏策划] 读书笔记

交互式媒体最有趣的地方在于&#xff0c;它让玩家直面问题&#xff0c;思考、尝试各种解决方案&#xff0c;并体验各种解决方案的结果。然后玩家可以回到思考阶段&#xff0c;规划下一步行动。这种反复试错的过程中&#xff0c;玩家的脑海里就会构建出一个互动的世界。 [读书笔…