gcc编译动态库静态库及Makefile知识汇总;

2023-05-16

gcc编译、动态库静态库及Makefile知识汇总

  • gcc编译过程
    • gcc的常用选项
    • 静态库,动态库并制作;
  • Makefile 基本使用
    • make工具简介

gcc编译过程

我们在Linux下使用vim命令写的.c文件,想要这个文件编译、运行的话就要使用"gcc [选项] 文件名" 这个格式的命令来操作,具体有四个步骤。通过下面的图片来简单介绍:
在这里插入图片描述
生成可执行程序过程为成四个步骤:

1、由.c文件到.i文件,这个过程叫预处理
2、由.i文件到.s文件,这个过程叫编译
3、由.s文件到.o文件,这个过程叫汇编
4、由.o文件到可执行文件,这个过程叫链接

1、预处理:

预处理是读取c源程序,对其中的伪指令和特殊符号进行“替代”处理;经过此处理,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,仍然是C文件,但内容有所不同。伪指令主要包括以下三个方面:
(1)宏定义指令,如#define NAME TokenString, #undef以及编译器内建的一些宏,如_DATE_,FILE, LINE, TIME,_FUNCTION_等。
(2)条件编译指令,如#ifdef, #ifndef, #else, #elif, #endif等。
(3)头文件包含指令,如#include “FileName”或者#include 等。

预处理的过程主要包括以下过程:
将所有的#define删除,并且展开所有的宏定义
处理所有的条件预编译指令,比如#if 、#ifdef、#elif、#else、#endif等
处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。
删除所有注释“//”和“ /
/”
添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
保留所有的#pragma编译器指令,因为编译器需要使用它们

2、编译

编译程序所要做的工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码

3、汇编
汇编过程实际上把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个c语言源程序,都将最终经过一处理而得到相应的目标文件。

4、链接
汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,在某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件的函数,等等,所有的这些问题,都需要经过链接才能得以解决,链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体,也就是可执行程序,根据开发人员指定的库函数的链接方式的不同,链接处理可分为两种:①静态链接 ②动态链接。

动态链接:动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行。 动态链接生成的程序体积较小,但是必须依赖所需的动态库,否则无法执行。

静态链接:静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行,不过静态链接生成的程序体积较大。

对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越,在某些情况下动态链接可能带来一些性能上的损害。

在Linux下可以使用gcc --help 来查看详细内容

gcc的常用选项

选项说明
-E只进行预处理,不编译(简单的宏替代,伪指令的处理)
-S只编译,不汇编
-c只编译、汇编,不链接
-g编译生成可执行文件包含gdb调试信息,可被gsb调试
-o指定编译生成可执行文件名
-I(i大写)指定include包含文件的搜索目录
-L指定链接所需库(动态库或静态库)所在路径
-l(L小写)指定所需链接库名
-ansiANSI标准
-std=c99c99标准
-werror不区分警告和错误,遇到任何警告都停止编译
-wall开启大部分警告提示
–static静态编译
-static静态链接
-O0关闭所有优化选项
-O1第一级别优化,使用此选项可使可执行文件更小、运行更快,并不会增加太多编译时间,简写为-O
-O2第二级别优化,采用了几乎所有的优化技术,使用此选项会延长编译时间
-O3第三级别优化,在-O2的基础上增加了产生inline函数、使用寄存器等优化技术
-Os此选项类似-O2,作用是优化所占用的空间,但不会进行性能优化,常用生成最终版本

静态库,动态库并制作;

库是什么呢?本质上来说,库时一种可执行代码的二进制形式,可以被操作系统载
入内存执行。我们通常将一些通用函数写成函数库,所以库是别人写好的,现有的,成熟的,可以复用的代码,你可以使用但要必须得遵守许可协议。在我们现实开发过程中,不可能每一份代码都从头编写,当我们拥有库时,我们就可以直接将我们所需要的文件链接到我们的程序中。可以为我们节省大量的时间,提高开发效率。Linux下库分为两种,静态库和动态库。这两种库相
同点是两种库都是由.o文件生成的

1, 静态库
静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,windows和linux下都是后缀用”.a”,“xxx”为静态库名,windows下的静态库名也叫libxxx.a;
链接时间: 静态库的代码是在编译过程中被载入程序中。
链接方式:静态库的链接是将整个函数库的所有数据都整合进了目标代码。这样做优点是在编译后的执行程序不在需要外部的函数库支持,因为所使用的函数都已经被编进去了。缺点是,如果所使用的静态库发生更新改变,你的程序必须重新编译。
1.1制作静态库
首先,我们需要有三个文件,分别为 function.c、fuction.h、test.c .

//这个是我们自己写的一个对strchr()函数的实现,然后就要在test.c文件里调用它
#include <stdio.h>
#include<string.h>
char *my_strchr(const char *s, int c)
{
    if(s == NULL)
    {
        return NULL;
    }

    while(*s != '\0')
    {
        if(*s == (char)c )
        {
            return (char *)s;
        }
        s++;
    }
    return NULL;
}

上面这个函数就好比第三方的库中函数你需要使用它就要链接它;

//这个就是我们的主函,调用上面这个function.c 来使用它;
#include <stdio.h>
#include<string.h>

#include"function.h"

int main(int argc, char *argv[])
{
    const   char str[]= "hello,this is a library";
            char         ch = 'a';
            char        *ret;

    ret = my_strchr(str,ch);//来自function.c文件

    printf ("%c后面的字符串是:%s\n",ch,ret);

    return 0;
}
//一个头文件function.c 里面写了函数的声明;
#ifndef __FUNCTION__H
#define __FUNCTION__H


char *my_strchr(const char *s, int c);


#endif

现在我们有三个文件

maqianjun@ubuntu-18:~/library$ ls
function.c  function.h  test.c

然后,来制作静态库;

1.gcc -c *.c ( gcc -c funtion.c test.c )
//将所有的c文件编译生成 .o 文件;

2.ar -rcs libfunction.a *.o
//将所有的 .o 文件打包生成一个静态库 .a 文件
maqianjun@ubuntu-18:~/library$ gcc -c *.c
maqianjun@ubuntu-18:~/library$ ls
function.c  function.h  function.o  test.c  test.o

maqianjun@ubuntu-18:~/library$ ar -rcs libfunction.a *.o       
maqianjun@ubuntu-18:~/library$ ls
function.c  function.h  function.o  libfunction.a  test.c  test.o 

做到这里我们已经制作好一个静态库了,这样你就可以把这个静态库发给别人了,别人可以使用了。然后我们要进行编译运行了;

maqianjun@ubuntu-18:~/library$ gcc test. -lfunction
gcc: error: test.: No such file or directory

这是为什么?
报错说没有找到文件或文件夹;
其实,系统在就收到 -lfunction 命令后将会到存放库的文件夹中寻找这个静态库,我的Linux系统是在 /usr/lib/usr/local/lib 的这个文件夹下,很显然,这个文件夹下并没有我们制作的 function.h 所以,一种方法是将我们自己制作好的静态库放到这个文件夹下,编译时就可以找到这个库了,但是,想要将我们制作的库放到 /usr/lib 下,是需要 root 权限的,所以,我们通常会加上 **-L.**这个选项,-L 用来指定除了 /lib/usr 文件以外还要到其他路径寻找, . 表示当前路径,命令如下:

gcc test.c -lfunction -L.

maqianjun@ubuntu-18:~/library$ gcc test.c -lfunction -L.  
maqianjun@ubuntu-18:~/library$ ./a.out 
a后面的字符串是:a library

2, 动态库
动态库的命名方式与静态库类似,前缀相同为“lib”,linux下后缀名为“.so(shared object)”即libxxx.so;而windows下后缀名为“.dll(dynamic link library)”即libxxx.dll;
链接时间:动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函数。这样做缺点是因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。优点是动态库的改变并不影响你的程序,所以动态函数库升级比较方便。

它们两个还有很明显的不同点:
当同一个程序分别使用静态库,动态库两种方式生成两个可执行文件时,静态链接所生成的文件所占用的内存要远远大于动态链接所生成的文件。
这是因为静态链接是在编译时将所有的函数都编译进了程序,而动态链接是在程序运行时由操作系统帮忙把动态库调入到内存空间中使用。另外如果动态库和静态库同时存在时,链接器优先使用动态库。

2.1制作动态库
首先,要通过命令来生成;

 gcc -fPIC -shared change.c -o libchange.so
//PIC:Position Independent Code(位置无关代码),即这个 .so 文件 具体放在内存中的那个位置是不确定的,只有在链接的时候才决定;

这样就生成好了动态库。

maqianjun@ubuntu-18:~/library/dynamtic$ ls
function.c  function.h  libfunction.so  test.c

然后我们开始编译运行;

maqianjun@ubuntu-18:~/library/dynamtic$ gcc test.c -lfunction -L.
maqianjun@ubuntu-18:~/library/dynamtic$ ls
a.out  function.c  function.h  libfunction.so  test.c
maqianjun@ubuntu-18:~/library/dynamtic$ ./a.out 
./a.out: error while loading shared libraries: libfunction.so: cannot open shared object file: No such file or directory

为什么会报错?
其实,因为在程序选择使用动态链接到动态库时,并不会将动态库中的代码拷贝到可执行文件中,而仅仅只是告诉可执行文件需要用到那个动态库,当可执行文件运行时,回到指定目录 /usr/lib 下去找到这个动态库并加载进来然而,我们并没有把 libchange.so 文件放到指定的文件夹中,所以就出现了“没有这样的文件或目录”错误;

一种方法,和前面一样,就是将这个动态库考到 /usr/lib 下,但是并不是所有人都有 root 权限;

第二种方法:在linux系统中,存在有个环境变量(在不同目录中都是不一样的)LD_LIBRARY_PATH,系统在寻找动态库时,会到两个地方去找,一个是我们提到的 /usr/lib 中,而另一个,便是该环境变量指定的路径;通过修改这个环境变量为当前的路径,就可以让系统除了到 /usr/lib 下寻找动态库,还可以到当前路径下寻找;
还需要注意一点,在更改时需要使用绝对路径,不能使用相对路径,pwd命令可以查看当前的绝对路径;
可以先使用pwd查看绝对路径后在赋值,也可以使用命令置换符 · ;

 export LD_LIBRARY_PATH=`pwd`
 
maqianjun@ubuntu-18:~/library/dynamtic$ export LD_LIBRARY_PATH=`pwd`
maqianjun@ubuntu-18:~/library/dynamtic$ ./a.out 
a后面的字符串是:a dynamtic library

Makefile 基本使用

先来了解一下Makefile的基本概念:

makefile其实就是一个文档,里面定义了一系列的规则指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,它记录了原始码如何编译的详细信息! makefile一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make工具简介

make工具是一个根据makefile文件内容,针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文件)并执行相关动作(编译等)的工具 。而这个makefile文件类似一个脚本,其中内容包含make所要进行的处理动作以及依赖关系。

另外make的一个好处就是当你对某个源文件进行了修改,你再次执行 make 命令,它将只编译与该源文件相关的目标文件而不是整个代码工程,因此,为编译完最终的目标(可执行文件)节省了大量的时间提高工作连贯性。比如一个工程下面有A.c 、B.c、 B.c三个文件,在make生成可执行目标文件之后,改动了A.c,则再次make时,只会执行有关A.c处理动作,其它的不处理。
学习make工具,需要明白三个概念:目标、依赖、处理动作。
下面通过一个简单的文件来学习使用一下Makefile;

#include<stdio.h>
#include"hello.h"                    
int main(int argc, char *argv[])          //hello.c
{
    int   a = 5;
    int   b = 6;
    int   c;
 	c = add(&a, &b);
    
    printf("%d\n",c);
    printf ("hello world\n");
    return 0;
}   
#include<stdio.h>                    //add.c
int add(int *a, int *b)
{
    int   c;
    c = ((*a)+(*b));
 	return c;
}
int add(int *a, int *b);              //hello.h

然后我们开始写个makefile;
首先makefile 的基本格式是:目标;依赖;命令;

target ... : prerequisites ...
command
...
...

target也就是一个目标文件,prerequisites就是要生成那个target所需要的文件或是目标。command也就是make需要执行的命令。(任意的Shell命令)这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。

//定义变量
APP_NAME = hello
cc=gcc
//这里的all是整个makefile文件的第一个目标,也就是总的目标,当我们输入make的命令时就是完成这个目标

all:
    ${cc} add.c hello.c -o ${APP_NAME}

//clean是一个单独的目标,该目标没有被总的目标all依赖或执行,所以默认该目标不会被执行,如果想执行该目标,则可以在Linux命令行下输入makeclean来执行
clean:
    rm -rf ${APP_NAME}

敲make
可以看到

maqianjun@ubuntu-18:~/test$ ls
add.c  hello  hello.c  hello.h  hello.h.gch  makefile  memory.c
maqianjun@ubuntu-18:~/test$ ./hello 
11
hello world

这就是makefile简单的使用。
以上内容就是博主自己对这些知识的汇总。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcc编译动态库静态库及Makefile知识汇总; 的相关文章

  • 激光点云有关目标检测与目标跟踪的消息定义

    1 jsk recognition msgs BoundingBoxArray msg 安装jsk recognition msgs xff1a sudo apt get install ros melodic jsk recognitio
  • Linefit_ground_segmention文章梳理及代码阅读

    2013年专门针对地面分割的文章 xff1a Fast segmentation of 3D point clouds for ground vehicles 代码链接 xff1a https github com lorenwel lin
  • 使用MFC+GDI编写地图编辑器补充

    使用MFC 43 GDI编写地图编辑器补充 小宝乱猜 在编写MapEdit时我遇到一个问题 xff0c 那就是在程序开始时一切正常 xff0c 但在打开一个地图文件后 xff0c 程序就会因找不到资源文件而画面混乱 调试了半天才发现是相对路
  • 基于select模型的TCP服务器

    之前的一篇博文是基于TCP的服务器和客户机程序 xff0c 今天在这我要实现一个基于select模型的TCP服务器 xff08 仅实现了服务器 xff09 socket套接字编程提供了很多模型来使服务器高效的接受客户端的请求 xff0c s
  • 路由器端口介绍

    路由器所在的网络位置比较复杂 xff0c 既可是内部子网边缘 xff0c 也可位于内 外部网络边缘 同时为了实现强大的适用性 xff0c 它需要连接各种网络 xff0c 这样 xff0c 它的接口也就必须多种多样 对于这些 xff0c 不要
  • 光流(Optical Flow)

    光流的概念 光流是一种描述像素随时间在图像之间运动的方法 随着时间流逝 同一个像素会在图像中运动 我们希望追踪他的运动过程 稀疏光流 计算部分像素 稠密光流 计算全部像素 稀疏光流以Lucas Kanade光流为代表 简称LK光流 光流的两
  • 模块化程序 点与圆的关系 类中成员函数的声明和实现分开写入头文件和源文件中

    64 TOC 模块化程序 点和圆的关系 在黑马程序员课程4 1 3成员属性设置为私有 课后案例 点和圆的关系中 谈到了文件的封装 此案例是判断点与圆的关系 xff0c 重点是以另外一个类作为本类中的成员 xff1b 在比较大的开发中 xff
  • c++模板类/模板函数的声明与定义应该放在头文件里

    如果函数模板按照普通的函数声明放在头文件的 xff0c 定义放在 cpp文件 xff0c 会出现错误 xff1a 模板函数声明 定义 引用有什么要注意的问题么 xff1f xff1f mylib h template lt class T
  • checksum-8位和16位校验和代码示例

    span class hljs comment linux 系统编译通过 span span class hljs comment gcc filename c o filename span span class hljs comment
  • 安卓鉴权方式的总结

    HTTP Basic Authentication 这种授权方式是浏览器遵守http协议实现的基本授权方式 HTTP协议进行通信的过程中 xff0c HTTP协议定义了基本认证认证允许HTTP服务器对客户端进行用户身份证的方法 效果 xff
  • 手把手教你使用Vue搭建注册登录界面及前端源码

    文章目录 一 前言二 概况三 搭建注册页面四 改造登录页面四 整体效果动画演示五 前端源码下载六 后续 一 前言 本文将在vue admin template模板基础上完成搭建注册与登录页面 文末处有完整的前端源码下载 环境准备 浏览器 x
  • 从传感器和算法原理讲起,机器人是如何避障的

    导语 xff1a 本文内容来自大道智创CTO邢志伟在雷锋网硬创公开课的分享 xff0c 由雷锋网旗下栏目 新智造 整理 编者按 xff1a 本文内容来自大道智创CTO邢志伟在雷锋网 公众号 xff1a 雷锋网 硬创公开课的分享 xff0c
  • or1200处理器中的特殊寄存器

    以下内容摘自 步步惊芯 软核处理器内部设计分析 一书 OR1200中的寄存器分为两类 xff1a 通用寄存器r0 r31 特殊寄存器 特殊寄存器又分为11组 xff0c 在本书第1 3 3节简单地列出了所有的特殊寄存器组 从列表中可以发现除
  • 基础面试题 :大端、小端及转换方式

    理解网络中大端和小端往往是一道基础面试题 xff0c 这里作为记录和整理 xff0c 希望能帮到大家 目录 前言 一 字节序 二 什么小端顺序 三 什么大端顺序 四 处理器体系所属网络字节顺序 五 大小端转换 1 大端整形转换为小端 2 小
  • RS485——A与B波形与电路分析

    一 理论知识 发送端 AB间的电压差 xff0b 2 xff5e xff0b 6v 逻辑1 xff0d 2 xff5e xff0d 6v 逻辑0 xff1b 接收端 AB间的电压差 大于 xff0b 200mv 逻辑1 小于 xff0d 2
  • vsCode软件安装code runner插件,运行shell脚本,terminal终端不显示运行结果数据

    问题 vsCode软件安装code runner插件 xff0c 运行shell脚本 xff0c terminal终端不显示运行结果数据 原因分析 运行shell脚本 xff0c 没有指定运行的bash环境 解决办法 在Code runne
  • Microsoft Visual C++ Redistributable 与 Visual C++ 的区别与联系?

    Visual Studio xff1a 是一款开发软件 xff0c 即我们俗称的 IDE xff0c 有很多版本 xff0c 如 Visual Studio 2010 Visual C 43 43 xff1a Visual C 43 43
  • ROS下采用camera_calibration进行单目相机标定

    参考 xff1a https blog csdn net learning tortosie article details 79901255https blog csdn net learning tortosie article det
  • C++使用libcurl做HttpClient

    当使用C 43 43 做HTTP客户端时 xff0c 目前通用的做法就是使用libcurl 其官方网站的地址是http curl haxx se xff0c 该网站主要提供了Curl和libcurl Curl是命令行工具 xff0c 用于完
  • ROS小车打造(十一)--arduino订阅/发布Topic

    1 安装arduino Software Arduino 选择对应的版本下载 xff0c 下载后解压安装运行 sudo tar xvf arduino 1 8 18 linux64 tar tar sudo mv arduino 1 8 1

随机推荐

  • 简单谈谈5G/C-V2X技术与自动驾驶的关系

    一 什么叫自动驾驶 自动驾驶分为 6 个等级 xff1a Level 0 xff1a 人工驾驶 xff0c 无驾驶辅助系统 xff0c 仅提醒 Level 1 xff1a 辅助人工驾驶 xff0c 可实现单一的车速或转向控制自动化 xff0
  • axios详解

    文章目录 axios是干啥的原生XMLHttpRequest实现axios介绍 发送并发请求 axios API 创建一个实例Config配置选项默认设置 全局默认设置实例中自定义默认值设置的优先级 响应信息 response schema
  • 浅谈一下汽车行业中的OTA/FOTA/SOTA

    首先来一个背景知识铺垫 xff1a 被誉为汽车界 苹果 的特斯拉 xff0c 从它的第一款ModelS上市开始 xff0c 截止到2017年3月份的5年时间里 xff0c 总计对车辆推送了25次远程升级 特斯拉每次发布新系统新功能就可以通过
  • 三分钟看懂什么是边缘计算和云计算

    随着科技的发展 xff0c 社会的进步 xff0c 各种尖端科技层出不穷 xff0c 各种新概念和课题也是百花齐放 xff0c 前几年如雨后春笋般涌现出来的大数据 云计算这些个高科技 xff0c 左查右问 xff0c 花了好大工夫好不容易才
  • 如何提升github的clone速度(简单粗暴,亲测有效)

    今天在github上看上了一个项目 xff0c 想要clone到本地来 项目比较大 xff0c clone速度很慢 xff0c 一开始还有50 60k的速度在跑 xff0c 到后来居然给我降到了4K s xff0c 看得实在是蛋疼 于是去百
  • CAN总线数据帧/标准帧/扩展帧/远程帧/错误帧的组成格式对比

    最近在研究CAN总线的驱动 xff0c 需要详细了解数据帧 标准帧 扩展帧 远程帧 错误帧这几种帧的详细组成格式 xff0c 于是收集了一下 xff0c 统一放在这里进行对比和记录 xff0c 以便日后需要时查阅 1 数据帧 标准帧 CAN
  • 图解CAN总线数据的组成和帧格式

    CAN 是Controller Area Network 的缩写 xff08 以下称为CAN xff09 xff0c 是ISO国际标准化的串行通信协议 在汽车产业中 xff0c 出于对安全性 舒适性 方便性 低公害 低成本的要求 xff0c
  • 关于CAN总线的位时间/同步段/传播时间段/相位缓冲段/采样点

    根据 CAN 规范的要求 xff0c 总线上的所有器件都必须使用相同的比特率才能完成通信 然而 xff0c 并非所有器件都要求具有相同的主振荡器时钟频率 所以 xff0c CAN 总线能够在一定的范围内容忍总线上 CAN 节点的通信波特率的
  • NAND FLASH/NOR FLASH/EMMC等存储器的比较和区别

    首先介绍一下NAND FLASH NOR FLASH xff1a Nand Flash xff1a Nand Flash存储器是Flash存储器的一种 xff0c 其内部采用非线性宏单元模式 xff0c 为固态大容量内存的实现提供了廉价有效
  • 如何计算CAN总线的负载率以及每帧耗时和每秒最多传输帧数

    今天遇到一个问题 xff0c 需要计算一下CAN总线上 xff0c 不同的波特率下 xff0c 每秒钟最多能够传输多少帧数据 xff0c 或者说 xff0c 每帧数据需要耗时多少时间 一开始以为这个东西是很基础的确定性数据 xff0c 百度
  • 如何在bat脚本中显示出该脚本文件的相关信息

    今天在研究windows系统下的bat脚本 xff0c 想要在bat脚本运行的过程中 xff0c 输出脚本文件自身的一些信息 xff0c 经过一番查阅和摸索 xff0c 采用以下代码就可以实现 xff1a 64 span class tok
  • 如何在bat脚本中列出指定目录下的所有文件信息

    今天在研究windows系统下的bat脚本 xff0c 想要去遍历一个目录并输出该目录下的所有文件的详细信息 经过一番查找和摸索 xff0c 使用以下代码即可实现 xff1a 64 span class token function ech
  • 解决IDEA导入maven项目Plugin ‘org.apache.maven.pluginsmaven-compiler-plugin‘ not found问题

    问题 xff1a 导入了maven项目 xff0c 报错Plugin org apache maven plugins maven compiler plugin not found等问题 xff0c 不仅仅是 maven compiler
  • ISO11898/ISO14229/ISO14230/ISO15031/ISO15765标准对比简介

    各行各业都有很多的国际标准和规范 xff0c 汽车行业也不例外 xff0c 经常遇到一套一套的标准和规范 xff0c 什么ISO11898 xff0c ISO14229 xff0c ISO14230 xff0c ISO15031 xff0c
  • 如何解决UltraCompare中中文显示乱码的问题

    作为一名程序猿 xff0c 对代码进行对比分析是经常避免不了的 xff0c 这时候就需要一个很好用的对比工具 xff0c 我选择了大名鼎鼎的Ultra Compare 但是 xff0c 使用过程中发现 xff0c 这家伙居然不支持中文 xf
  • 一文简单介绍眼图

    搞通信行业的 xff0c 经常要关注信号的传输质量 xff0c 近几年开始出现了一个新的名词 xff0c 叫眼图 xff0c 可以非常直观的体现出信号传输的情况 那么 xff0c 什么是眼图 xff0c 怎么解读眼图 xff0c 下面就为大
  • 下一代CAN通信技术CAN XL简介

    众所周知 xff0c CAN网络具有易于实现 可扩展 并支持复杂拓扑结构等诸多优点 xff0c 所以目前在各个行业特别是汽车领域 xff0c 得到了非常广泛的应用 但是 xff0c 它也存在着诸多问题 xff0c 其中最大的一点就是总线带宽
  • 聊一下质量管理体系中的DQE/SQE/PQE/CQE

    最近接触了不少质量体系的话题 xff0c 反复的听到SQE DQE等 xff0c 大概知道是跟质量管理相关的一些职位 xff0c 但是具体也不是很清楚 xff0c 于是干脆来理一下 正式开始之前 xff0c 先要介绍一下他们的老祖宗 xff
  • C语言字符串库函数 #include <string.h>

    c语言字符串库函数 include lt string h gt 在头文件 lt string h gt 中定义了两组字符串函数 第一组函数的名字以str开头 xff1b 第二组函数的名字以mem开头 只有函数memmove对重叠对象间的拷
  • gcc编译动态库静态库及Makefile知识汇总;

    gcc编译 动态库静态库及Makefile知识汇总 gcc编译过程gcc的常用选项静态库 xff0c 动态库并制作 xff1b Makefile 基本使用make工具简介 gcc编译过程 我们在Linux下使用vim命令写的 c文件 xff