首页 > 其他分享 >day01

day01

时间:2023-08-06 23:33:06浏览次数:23  
标签:文件 gcc day01 编译 Linux 共享 环境变量

操作系统课程内容:     系统介绍、内存管理、文件管理、信号处理、进程管理、进程通信、线程管理、线程同步、网络通信
UNIX系统简介:     1970年于美国贝尔实验室,作者肯.汤普逊和丹尼斯.里奇     UNIX是最早的多用户、多任务、支持多种CPU架构,高稳定性、高可靠性、高安全性     既能构建大型关键型业务系统的服务器(银行、电信公司等),也能支持移动嵌入式设备
    Minix(1987年)是一种开源的基于微内核架构的类UNIX计算机操作系统,Linux之父林纳斯.托瓦兹收到Minix的启发,开发了Linux内核的第一个版本
Linux系统简介:     全称:GNU/Linux(1991)是一个基于POSIX的多用户、多任务、支持多线程的多CPU的操作系统,支持32位/64位硬件,能运行主要的UNIX工具软件、应用程序和网络协议     Linux继承了UNIX以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux有上百种不同发发行版
    相关知识:         Linux的标志:企鹅(开源)         GNU计划/组织:目前全球最大的开发开源系统的开源组织,负责Linux内核源的升级和维护         GPL通用许可证:在带有GPL证书的代码基础下开发出来的软件,也都需要支持GPL证书         POSIX统一可移植操作系统接口:Linux是完全遵循,UNIX绝大部分遵循,所以它们的命令、API接口基本上都是通用的         发行版:Linux只是内核,内核+Shell+基础软件 = 用户操作系统             不同的公司开源根据Linux内核制作出不同版本、不同风格的Linux发行版,例如:Ubuntu、Redhat、CentOS、Debian
GNU编译工具gcc\g++:     多样化:         支持多种编译语言、支持各种操作系统         gcc -v  查看版本信息     编译构建过程:         预处理:gcc -E code.c -o code.i         编译:gcc -S code.i (生成) code.s         汇编:gcc -c code.s (生成) code.o         链接:gcc a.o b.o...(生成) a.out     文件类型:         .c          源文件         .h          头文件         .h.gch      头文件的编译结果,会被优先使用         .i          预处理文件         .s          汇编文件         .o          目标文件(二进制)         .a          静态 库文件         .so         共享 库文件     编译参数:         -E                  只预处理         -S                  只生成汇编代码         -o                  指定编译结果的文件名         -c                  只编译不链接         -std                指定语法标准    -std=gnu99         -g                  生成调制信息         -Wall               尽可能多得产生警告         -Werror             把警告当错误处理         -L                  指定库文件的查找路径         -l                  指定要一起加载的库文件名 -lm         -I                  指定头文件的加载路径 <> ""  (优先级最高)         -pedantic -anis      对于不符合ANIS/ISO标准的语法产生警告     预处理指令:         #include <>/""  导入头文件         #define  定义宏常量、函数         #undef  删除宏         #ifdef  宏存在则条件为真         #ifndef 宏不存在则条件为真         #endif           #if/#elif/#else/#endif  条件判断编译         #error  提示错误,并阻止生成可执行文件,一般与条件判断配合             #error "提示信息"         #warning 提示警告         #line 设置行号 影响了提示错误、提示警告的行号         #pragma pack(n) 设置对齐、补齐的最大字节数         #pragma once 相当于头文件卫士,防止头文件重复导入         #pragma GCC dependency "file.h" 监控文件是否有修改         #pragma GCC poison key 设置关键字key为毒药,禁止在后续代码中使用
库:     库文件是目标文件(二进制文件)的集合,可以被其他代码调用,把代码封装成库文件后方便使用、方便管理,安全性高、保密性强
    *****会讲******     静态库:  -a         就是目标文件的集合,当调用静态库时,编译器会把静态库的所有二进制指令拷贝到最后的可执行文件中         优点:运行速度比共享库快,运行时不需要依赖静态库文件         缺点:可执行文件比共享库大,当静态库有修改后,所有依赖使用了该静态库的可执行文件都需要重新编译
    共享库(动态库):  -so         就是带入口的可执行文件,当调用共享库时,调用语句处会记录该函数在共享库中的位置,并且共享库文件要与运行的可执行文件一起加载到内存中,当执行到调用共享库的语句时,就会跳转到共享库二进制指令的内存中执行,执行完后会跳转回调用语句处         缺点:运行速度相对慢,运行时需要依赖于共享库文件         优点:可执行文件相对较小,当共享库有修改,可执行文件不需要重新编译         静态库:     制作静态库:         1、编译出目标文件             gcc -c xxx.c ...         2、打包目标文件生成静态库文件             ar -r libxxx.a x.o x.o ...             使用静态库:         1、直接使用             gcc xxx.c libxxx.a (意义不大)         2、指定库文件的位置             gcc xxx.c -Lpath -lxxx                 -L指定库的路径 -l库名 指定要加载的库(库名不包括前缀lib 后缀.a\.so)         3、通过修改配置文件中的环境变量来指定库的查找路径             打开系统配置文件:                   vim ~/.bashrc             在配置文件末尾添加:                 export LIBRARY_PATH=$LIBRARY_PATH:新路径(绝对路径)               保存退出并重新加载配置文件                 source ~/.bashrc             使用静态库:                     gcc xxx.c -lxxx     共享库:     制作共享库:         1、编译生成目标文件             gcc -fpic -c xxx.c                 -fpic 生成与位置无关的文件         2、生成共享库文件             gcc -shared -fpic x.o x.o x.o ... -o libxxx.so     使用共享库:         编译时:         1、直接使用             gcc xxx.c libxxx.so (意义不大)         2、指定库文件的位置             gcc xxx.c -Lpath -lxxx                 -L指定库的路径 -l库名 指定要加载的库(库名不包括前缀lib 后缀.a\.so)         3、通过修改配置文件中的环境变量来指定库的查找路径             打开系统配置文件:                   vim ~/.bashrc             在配置文件末尾添加:                 export LIBRARY_PATH=$LIBRARY_PATH:新路径(绝对路径)               保存退出并重新加载配置文件                 source ~/.bashrc             使用共享库:                     gcc xxx.c -lxxx
    运行时;         运行时,系统会去默认指定的共享库加载路径进行加载共享库,一般还是通过修改配置文件的环境变量进行设置         export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:共享库的加载路径
    注意:         1、如果指定路径下有同名的静态库文件、共享库文件,gcc编译器会默认优先加载共享库文件            如果想要优先使用同名静态库文件 增加 -static编译参数实现         2、对配置文件中的环境变量进行删除修改时,最好重启终端才生效
        练习:             把常用的数据结构、算法封装成libdsa.so             把常用的头文件放入 /usr/include             栈、队列、通用链表、 平衡二叉树、查找(顺序、二分)、排序(快排、冒泡、计数、插入、选择)
        动态使用共享库:             作用:在代码中决定使用哪些共享库,编译时不需要指定,执行时还是需要依赖共享库             dlopen、dlerror、dlsym         库文件相关的辅助命令:     ldd 查看可执行文件依赖哪些共享库     nm 查看目标文件、可执行文件、静态库、共享库文件的符号列表     strip 减肥 删除目标文件、可执行文件、静态库、共享库文件的符号列表(不影响功能)

环境变量表:     操作系统会给每个执行的程序提供一张环境变量表,该表中记录了操作系统在提供的时候所处于的所有环境变量,这些环境变量反映了操作系统的配置情况以及该程序所处操作系统中的环境情况
    通过声明 extern char** environ;就可以使用该程序的环境变量表     这个表可以随意使用,因为只是操作系统提供的一张拷贝表     for(int i=0;environ && environ[i];i++)     {           printf("%s\n",envir[i]);                                     }       操作环境变量表的函数:         char *getenv(const char *name);         功能:通过环境变量的名获取它的值         int setenv(const char *name,const char *value,int overwrite);         功能:向环境变量表中添加新的环境变量             name:环境变量名             value:环境变量的值             overwrite:当环境变量存在时                 非0:(覆盖)修改原来环境变量的值                 0: 不修改             返回值:成功返回0、失败-1。         int putenv(char *string);         功能:向环境变量表中添加新的环境变量             string:以 环境变量名=环境变量值         int unsetenv(const char *name);         功能:删除环境变量             返回值:成功返回0、失败-1。
        int clearenv(void);         功能:情况环境变量表

        练习:         1、添加环境变量 ZHIZHEN=/home/ubuntu         2、删除环境变量 LIBRARTY_PATH         3、给LD_LIBRARY_PATH环境变量追加一个新路径 /xxx/xx
错误处理:     1、通过函数返回值表示出现错误         a、合法值成功、非法值失败             例如:计算位置、大小         b、返回值时指针类型时,返回NULL或者0x FFFF FFFF,其余都表示成功             malloc\mmap         c、返回0表示成功,-1表示失败,一般都是操作系统函数         d、永远成功 例如:printf     2、通过改变全局的错误编号,来表示出现了错误         errno 定义在 errno.h中         由于系统函数执行导致出现错误,就会改变errno的值         char *strerror(int errnum)         功能:根据errno的值获取对应的错误提示信息         注意:errno是一个全局变量,所有不能只根据它的值是否为0就简单地判断是否产生错误
    练习:           1、实现一个计算文件大小的函数         2、实现一个字符串查找子串的函数             类似strstr的功能,如果找到字串返回该字串第一次出现的位置         3、实现一个求两个整型的平均值的函数,考虑溢出问题

标签:文件,gcc,day01,编译,Linux,共享,环境变量
From: https://www.cnblogs.com/ymy1/p/17610352.html

相关文章

  • day01
    day01上参考文章:https://blog.csdn.net/qq_41580422/article/details/122770200onekeybatch快捷键//快捷键//注释ctrl+///运行ctrl+r//保存ctrl+s//编译ctrl+b//查找ctrl+f//字体缩放ctrl+鼠标滚轮//帮助文档F1//自动对齐ctrl+i//同名......
  • Linux环境编程day01--库与环境变量
    UNIX系统简介:1970年于美国贝尔实验室,作者肯.汤普逊和丹尼斯.里奇UNIX是最早的多用户、多任务、支持多种CPU架构,高稳定性、高可靠性、高安全性既能构建大型关键型业务系统的服务器(银行、电信公司等),也能支持移动嵌入式设备Minix是一种开源的基于微内核架构的类UNIX计算机操作......
  • 20天 hot 100 速通计划-day01
    哈希1.两数之和给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=......
  • day01_springboot综合案例
    springboot项目课程目标1.【掌握】SSM整合2.【掌握】使用SSM完成查询3.【理解】AdminLTE4.【理解】理解SSM综合案例表的结构springboot环境搭建搭建工程pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="htt......
  • Qt-day01
    //不用手动进行回收?://条件一:在QT中建立了内存回收机制从QBject派生的类,//条件二:指定父类,父类对象析构的时候,先析构子类对象 #include"mywidget.h"#include<QApplication>intmain(intargc,char*argv[]){//QApplication应用程序类每个程......
  • [代码随想录]Day01-数组part01
    题目:704.二分查找思路:二分查找一般是在有序的数组中查找指定的值,单纯的查找值,把数组跑一遍的复杂度为O(n)。二分查找每次把范围缩小一半,我们每次都去中间的值,有以下三种情况:如果mid位置的值比target大,那么target应该在mid左侧的位置(由小到大排序情况下)如果mid位置的值比t......
  • day01课程回顾
    day02:Java相关概念一、回顾程序:解决问题编写的一系列计算机指令的有序集合计算机语言低级语言机器语言汇编语言高级语言面向过程面向对象:JavaJava发展Java之父:詹姆斯高斯林1996年JavaJDK5.0是Java的分水岭我们用JDK8DOS命令Java特......
  • css学习Day01
    css学习Day01css语法选择器{​ 声明1;​ 声明2;​ 声明3;}一、css四种导入方式行内样式<h1style="color:red">标题</h1>内部样式<head><style>h1{color:green}</style></head>外部样式链接式:......
  • Python基础day01
    1.编码1.1计算机中所有的数据本质上由0和1来存储。注意:以什么编码保存就以什么编码打开否则会乱码。1.2pycharm运行地址:前面:python解释器地址后面:py文件地址 默认python解释器以'utf-8'编码打开文件。2.输入#将结果呈现给客户,print会在尾部加换行符print("xxx")#en......
  • java学习day01
    Day01java笔记1.什么是程序程序:为了让计算机执行某些操作或者解决某个问题而编写的有序集合计算机语言(1)低级语言机器语言只认识01汇编语言(2)高级语言面向过程语言:c语言面向对象语言:java,python,c#等2.人机交互控制台常用命令:(1)切换盘符D:+回车(2)dir 查......