首页 > 其他分享 >动态库&&静态库&&MakeFile

动态库&&静态库&&MakeFile

时间:2023-09-04 09:26:22浏览次数:53  
标签:文件 gcc 静态 MakeFile makefile 编译 && 动态

库文件

  1. 概念

    • 库文件就是将一堆函数的源代码封装在一起,经过编译之后形成一种可执行的二进制代码(但是不可以独立执行),供自己或者他人调用
  2. 在linux下,有非常多的目录存在库文件
    比如:
    /lib------>linux协同库文件,一般是linux自带的
    /usr/lib------>有的是系统自带的,有的是用户自定义移植的

  3. 库文件存放的是一些什么数据

    • 因为库文件是二进制文件,只是看到一片代码
    • 库文件里面存放的是数据,一般是一些函数

为什么要制作库文件

  • 编译之后的库文件看不到源码,可保密;同时不会因为不小心修改了函数而出问题,便于维护

分类

  • Windows下的库有两种:静态库(.lib)和动态库(.dll)
  • Linux下的库有两种:静态库(.a)和动态库(.so)
    我们主要研究linux下的库,动态库也称之为共享库

静态库与动态库的区别

  1. 静态库在gcc编译阶段把静态库放在一起编译,最后生成的二进制文件(文件比较大)
  2. 动态库在gcc编译阶段仅仅是记录了动态库的存放位置,在执行的时候才去指定的路径下调用该库

如何制作库文件

静态库----->libxxx.a
动态库----->libxxx.so
比如:liblockmgr.so.1.0.1
lib:库的前缀
lockmgr:库的名字
.so:库的后缀
.1:版本号
.0.1:库的修正号

静态库的制作

  1. 把.c文件编译成.o文件
    gcc -c add.c -o add.o
  2. 把.o文件编译成静态库文件
    ar -rc libadd.a add.o
    制作完毕之后,libadd.a就是静态库文件
    工程项目在编译的时候,把静态库加进来即可
编译:gcc main.c libadd.a -o main
执行:./main

动态库的制作

  1. 把.c文件制作成.so动态库
	gcc -fpic -shared add.c -o libadd.so
	-fpoc:制作动态库的参数
	shared:共享库
  1. 在工程项目编译的时候,把动态库加进来
    gcc main.c -o mian -L . -laa
    
    -L: 告诉编译器去哪里找动态库
    -l告诉编译器要连接的动态库的库名(不需要写前缀、后缀、版本号)
    -I 告诉编译器去哪里找头文件
    

工程管理文件makefile

  1. 什么是makefile

    • MakeFile称之为工程管理文件,用于管理一个工程中所有关联的文件。比如头文件,源文件,库文件...
  2. MakeFile在工程中是不是一定要写

    • 不一定。一般来说如果编译命令比较复杂,就会写makefile文件
    • 项目工程文件比较多的时候,一般会写makefile去管理所有文件
    • 项目工程文件比较少的时候,一般不写,因为编译命令比较简单
  3. 目的

    • makefile就是为了简化编译时的复杂度

项目工程文件应该有哪些文件组成?

  1. 简单版:所有的文件都在相同的路径下
  2. 复杂版:对应的文件放在对应的路径下

makefile书写规则

  1. 了解makefile书写规则的两个核心

    • 依赖:一般指.c文件
    • 目标:一般指可执行目标文件
  2. makefile书写规则

    • 确定目标叫什么名字
    • 按照以下规则去写makefile
    目标:依赖(如果有多个依赖,则每个依赖之间用空格分开)
    <tab键>执行规则
    比如:使用makefile来编译一个简单的程序
    hello:<tab键>hello.c
    <tab键>gcc $^ -o $@
    
  3. 重复执行 make命令,那么会出现什么情况?
    第一次make正常编译
    第二次make:
    make: “test”已是最新。

makefile变量的种类

在makefile中定义变量,不需要声明数据类型,只需要定义名字就可以了,所有的变量默认时字符串类型的
A------->默认就是字符串类型的变量
规定:

  • 变量名的命名规则与c语言一致
  • 给变量赋值的时候,等号两边可以有空格,也可以没有空格
  • 比如说A = hello A = hello
  • 在引用变量的值时,需要在变量前加一个\(,变量名也需要用()包含 A=hello B=\)(A)world
    因变量都是字符串类型,所以双引号可以省略
    A = hello
    A = "hello"
    修改简单版本的makefile,将目标和依赖保存在变量中

系统预设定变量

  • 有的变量已经在系统中定义好了,并且可以赋值,我们可以直接引用即可
    CC----->编译器名字,默认=cc cc等价于gcc 也就是说CC = gcc
    RM----->删除命令,默认等于rm -f 也就是RM = rm -f

自动化变量----->变量的值时不固定的,是变化的

  • $^------>代表所有依赖
  • $@------>代表所有的目标

makefile伪指令

  • 场景一:假设makefile中有一套规则:
    clean:
    $(RM)bin/main
    当我们执行make clean时,makefile就会执行这个规则

  • 场景二:假设makefile中有一套规则,并且当前目录下有一个文件夹clean
    clean:
    $(RM)bin/main
    当我们执行makefile时,出现如下情况
    image

如何告诉编译器,这个make clean是一套规则,而不是生成文件?
解决方案:使用伪指令
怎么添加?------->只需要在makefile中添加一句话
.PHONY:clean

makefile函数

  1. wildcard------->在指定的路径下寻找匹配的文件
    C语言函数调用 函数名(参数1,参数2,参数3)
    makefile函数调用$(函数名 参数1,参数2,参数3)
    比如:我想把当前目录下的所有.c文件名都找出来,并将这些文件名保存在C_SOURCE中
    C_SOURCE = $(wildcard ./c_source/*.c)

标签:文件,gcc,静态,MakeFile,makefile,编译,&&,动态
From: https://www.cnblogs.com/bcc0729/p/17673664.html

相关文章

  • javaee spring 静态代理
    静态代理packagecom.test.staticProxy;publicinterfaceIUsersService{publicvoidinsert();}packagecom.test.staticProxy;//目标类publicclassUsersServiceimplementsIUsersService{@Overridepublicvoidinsert(){System.out.print......
  • centos 设置静态IP
     查看本地IPifconfig编辑虚拟机设置,改为VMnet8(NAT模式)  查看网关,记录当前网络的网关,一会儿要用 进入存放修改IP地址的目录:cd/etc/sysconfig/network-scripts/编辑修改IP地址文件 vimifcfg-ens33 添加以下内容IPADDR=192.168.229.130......
  • ubuntu 虚拟机静态 IP 地址配置
    环境说明博主使用的平台及环境如下:虚拟机平台:VMwareubuntu版本:20.04ubuntu使用NAT模式联网在VMware设置子网与网关以管理员身份运行VMware,点击“编辑”-->“虚拟网络编辑器”选择“VMnet8”,取消勾选“使用本地DHCP服务将IP地址分配给虚拟机”,在“子网IP”中填......
  • Springboot项目打成jar包,如何设置存储路径?并且上传的静态文件如何访问?
    第一步设置资源资源存储路径找到需要保存指定文件路径添加以下代码//保存上传的资源文件路径,路径在部署jar包同级目录。Stringpath=System.getProperty("user.dir")+"/static/images/";Filedir=newFile(path);if(!dir.exists()){dir.mkdirs();}......
  • GCC实现多文件编译,静态库,动态库
    GCC实现多文件编译,静态库,动态库一代码 //add.hintadd(inta,intb);  //add.cintadd(inta,intb){  returna+b;}  //main.c #include<stdio.h>#include"add.h" voidmain(){   printf("3+2=%d\n",add(3+2));} 二......
  • 第一章 静态分析
    Lab1-11、查看文件编译时间使用PE-bear2、查看文件是否加壳使用PEiD3、查看文件导入函数来确定程序的基本功能使用PE-bear4、使用strings.exe查看可打印字符5、使用Restorator查看文件资源......
  • 服务器Nginx环境如何配置WordPress伪静态规则
    WordPress伪静态是指将动态生成的WordPress网站页面的URL转换为静态的URL,以便于搜索引擎优化和提高用户访问体验。与动态URL相比,静态URL更容易被搜索引擎索引,因为它们更具可读性和可理解性,同时也更容易被用户记住和分享。最近看到有粉丝在问服务器Nginx环境下如何配置......
  • Make和Makefile
    文章目录一、demo的目录结构二、使用Makefile生成可执行文件1、简单版本的Makefile2、使用变量改进Makefile3、使用自动变量继续改进Makefile4、使用%.o:%.c样式继续改进Makefile5、使用模块化继续改进Makefile三、Makefile中一些关键语法1、wildcard2、notdir3、patsubst4、`@......
  • vue3 + vite 动态引入不被打包的静态资源
    在开发中,通常会把一些静态资源放在assets文件夹下,但是assets目录下的内容是需要vite编译打包的,所以如果只是引用assets目录下的资源时,使用绝对路径、相对路径均可。但是,在开发中,我们经常会引用一些不被打包的资源,此时该资源是放在public目录下的,那么在引用时,路径的写法如下:不......
  • jsp(JAVA)伪静态的具体设置过程
    一:到  http://tuckey.org/urlrewrite/  下载urlrewrite架包(推荐2.6.0)二:解压所下载的文件,把urlrewrite-2.6.0.jar复制到项目的WebRoot/WEB-INF/lib/目录下三:把urlrewrite.xml复制到项目的WebRoot/WEB-INF/目录下四:在web.xml文件中加入以下<filter><filter-name>UrlRewriteFil......