• 系统中的obj文件、dll文件、so文件、lib文件、exe文件、vcproj文件、sln文件


    1. 源代码(.c等)要经过编译器编译得到目标代码(.obj),再经过链接器使目标代码库函数启动代码合并成一个文件,即可执行文件exe在这里插入图片描述

    2. 生成可执行文件时的链接过程又可根据链接库(动态链接库和静态链接库)的类型分为两种情况
    ##静态链接
    需要的文件: 头文件 .h 、静态库 .lib、项目文件(src源码)、启动代码
    a)使用静态链接库的项目先引用头文件.h(包含函数的声明等)经过编译得到目标代码
    b)链接时将静态库**.lib文件**(包含了函数的定义——实体代码、符号表等)全都直接包含在最终生成的exe文件中。 运行最终的exe文件时不再需要lib。

    ##动态链接
    需要的文件: 头文件 .h 、动态链接库的**.lib文件,动态链接库的.dll文件,项目文件(src源码)、启动代码
    a)使用静态链接库的项目先
    引用头文件.h(包含函数的声明等)经过编译得到目标代码
    b)这里的.lib包含
    dll文件与其中函数对应位置的信息**,.dll则包含了函数的定义——实体代码、符号表
    c)链接时将**.lib文件和动态库.dll文件及目标代码一起生成.exe文件。lib文件给目标代码在dll的解析**提供路径。 但是此时的exe文件中并没有真正的函数实体,要把dll放在和exe同一个目录下,每次运行都需要去dll调用,采用 LoadLibrary-GetProcAddress-FreeLibrary方法进行函数导入。
    与静态链接一样,一旦链接完成就不再需要lib文件。

    dll文件(windows,又称类库)、so文件(unix)、lib文件、exe文件:都是系统中编译后产生的最终产物。dll库也叫共享库,他的链接机制允许多个工程调用一个dll执行exe文件,而lib则不可以。
    lib是编译时需要的dll是运行时需要的。如果要完成源代码的编译,有lib就够了。如果也使动态连接的程序运行起来,有dll就够了 。 dll中其实就是一系列的API接口

    obj文件是仅通过编译器编译后的产物,没有和链接器链接;仅仅是源码翻译的机器码,**缺少入口函数(启动代码)**和库函数,无法直接执行。

    vcproj文件(工程文件)和sln文件(解决方案文件)可以看做不同级别的包含源代码的目录,其中还包含了部分配置信息。这个文件相当于linux系统中的makefile。cmake就是生成makefile的,VS其实也是一样,VS编译器会对新建的项目自动生成vcproj文件,并且实时更新。而VS的编译,其实就是基于这个类似makefile的vcproj的。一旦修改了.vcproj文件就需要重新build。
    vcproj.filter是控制项目在VS中的展示界面的,修改后编译不会重新build。
    包含关系:
    sln /vcproj /.c
    sln /vcproj /.h

    解决方案文件sln的生成: 是由工程文件生成的,同时生成的还有exe文件。
    动态链接库dll的生成: 2种情况
    1.自己创建的项目:解决方案文件(sln) 选一下环境release等, 然后点击生成 ,再点击生成xxxx(U),即生成了dll文件
    2.仅有下载的源码:通过cmake先对源码生成cmakelist.txt(相当于makefile和.vcproj,作用:定义源码编译链接的顺序等),然后用VS编译(make)出二进制文件(build)

    exe文件与dll文件区别:

    1. 类库生成的是dll,控制台console windows程序都是exe的
    2.dll里包含了目标代码中要调用的方法,但不可直接执行(跟cpu打交道),只允许被调用;exe是可执行文件(可以直接跟cpu打交道),一般做为程序的执行入口。

    Cmake:一种编译过程控制的软件(cuda10,cmake3.9.0+)
    1.首先新建一个cmakelist.txt文件,然后编写一个基本设置,如版本及目录包括的源码文件、生成二进制码的目录
    2.在工程总目录下新建build目录(这就是二进制码的目录)
    3.configure,会生成makefile文件(unix下)或projects/workspaces(windows vsc++下)
    4.进入build运行make即可完成编译。

  • 相关阅读:
    flask虚拟环境
    db.Column
    flask_cors跨域请求
    app.config.from_object
    jquery链式原理.html
    swiper轮播
    jquery引用
    animate.html
    设置和获取html里面的内容.html
    jquery获取dom属性方法
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12725257.html
Copyright © 2020-2023  润新知