学生网站建设可行性分析,wordpress记录主题使用情况,苏州最新情况最新消息今天,晚上必看的正能量视频下载这两天由于想要研究一下socket的相关内容#xff0c;但是没想到引入外部库还有这么多门道。
根据维基百科定义#xff1a;一个现代编译器的主要工作流程如下#xff1a;源代码#xff08;source code#xff09;→ 预处理器#xff08;preprocessor#xff09;→ 编译器…这两天由于想要研究一下socket的相关内容但是没想到引入外部库还有这么多门道。
根据维基百科定义一个现代编译器的主要工作流程如下源代码source code→ 预处理器preprocessor→ 编译器compiler→ 汇编程序assembler→ 目标代码object code→ 链接器linker→ 可执行文件executables最后打包好的文件就可以给计算机去判读运行了。所谓的IDE集成开发环境不过是把这些步骤集成到一起程序员可以专注于代码实现。 .cpp文件编译过程
以hello.cpp文件为例编译执行这个文件需要经过一下几个步骤
预处理执行gcc -E hello.cpp hello.i对.cpp文件进行预处理产出hello.i文件由于这个文件不可以直接看到的所以我对指令增加了重定向编译执行gcc -S hello.cpp对.cpp文件进行编译将高级语言转换成汇编语言产出hello.s文件汇编执行gcc -c hello.cpp将汇编指令转换成机器语言产出hello.o目标文件二进制链接执行gcc hello.cpp -o hello将一个或多个由编译器或汇编器生成的目标文件和外部库链接为一个可执行文件产出hello.exe文件 静态库
是一个外部函数与变量的集合体。静态库的文件内容其内容不像动态链接库那么复杂在编译期间由编译器与链接器将它直接集成至应用程序内并产出目标文件以及可以独立运作的可执行文件。Windows下静态库库为.lib后缀在linux下为.a后缀。
动态库
是一个包含可由多个程序同时使用的代码和数据的库。DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数并且允许进程可以共享调用。Windows下动态库为.dll后缀在linux下为.so后缀。 由于C/C的语言特性所有的函数必须先声明再调用所有单纯的动态库是无法被直接调用的而导出库的作用就是用来包含动态库中所有的的函数声明。导出库虽然与静态库都是.lib文件但是二者内容并不相同。
区别
相比于静态库直接集成到应用程序中动态库在程序编译时并不会被连接到目标代码中而是在程序运行是才被载入不使用的时候再从内存释放。不同的应用程序如果调用相同的库那么在内存里只需要有一份该共享库的实例规避了空间浪费问题。动态库在程序运行是才被载入也解决了静态库对程序的更新、部署和发布页会带来麻烦。
Visual Studio引入
在VS工程中在C/C工程中引入外部库的基本步骤
配置所有右键工程根目录→ 属性 → 最上面修改为“所有配置”、“所有平台”添加头文件目录右键工程根目录→ 属性 → C/C → 常规 → 附加包含目录添加include目录。添加lib静态库右键工程根目录 → 属性 → 链接器 → 常规 → 附加库目录添加lib目录。 添加工程引用的lib文件名工程 → 属性 → 链接器 → 输入 → 附加依赖项输入lib文件名。 注意有时候lib下并非实际的静态库针对不同版本还要继续找添加dll动态库把引用的dll放到工程的可执行文件所在目录即可。