(二)掌握最基本的Linux服务器用法——Linux下简单的C/C++ 程序、项目编译
1、静态库与动态库
静态库(Static Library):静态库是编译后的库文件,其中的代码在编译时被链接到程序中,因此它会与程序一起形成一个独立的可执行文件。每个使用静态库的程序都会有自己的库的副本,这可能会导致内存浪费。常用后缀名(.a)
优点:
·独立性:库的代码会被静态地链接到程序中,使程序变得独立并能够单独运行。
·版本控制:库的代码被嵌入在程序中,不受外部库版本的影响。
缺点:
·内存浪费:每个使用静态库的程序都会拥有库的一个副本,可能导致内存浪费。
·更新困难:更新库需要重新编译整个程序,部署和维护会相对复杂。动态库(Dynamic Library):是编译后的库文件,其代码在程序运行时由操作系统加载到内存中。
多个程序可以共享同一个动态库的实例,从而减少内存占用并提高程序的执行效率。动态库文件通常具有.so(Shared Object)后缀名,是一种在运行时动态加载的共享组件。
优点:
内存效率:多个程序可以共享同一个库文件的实例,减少内存使用。
更新和维护:库的更新只需替换库文件,不需要重新编译整个程序。
灵活性:程序可以动态加载和卸载库,提高程序的灵活性和可维护性。
缺点:
运行时依赖:程序在运行时需要动态库的支持,如果缺少库文件,程序将无法运行。
部署复杂性:需要确保目标系统上有正确版本的动态库。
2、软件源码编译与安装
检查编译工具:
在开始编译之前,确保系统中已安装了编译所需的工具,如编译器(例如gcc)、构建工具(如make)和开发库(如libc)等。可以通过包管理工具安装这些工具。
配置编译选项:
进入源代码目录,运行配置脚本以配置编译选项。通常,可以使用 ./configure命令来配置,但一些软件可能有自己的配置脚本。您可以使用不同的选项来启用或禁用功能、指定安装路径等。
编译源代码:
运行make命令来编译源代码。这将生成可执行文件和其他必要的文件。这一步很关键。
安装软件:
运行sudo make install命令以将编译后的文件安装到系统中。这将把文件复制到系统的标准安装路径,通常为/usr/local。
如果感兴趣,可以从网上找一些简单的安装的安装包试一试。
3、C与C++编译过程
编译过程、各种文件、
gcc相关
使用gcc来编译:
方法一、使用gcc单步生成
#预处理,生成中间文件(.i)
gcc -E source.c -o source.i
#编译,生成汇编代码(.s)
gcc -s source.i -o source.s
#汇编,生成目标文件(.o)
gcc -c source.s -o source.o
#链接,生成可执行文件
gcc source.o -o my_program
方法二、使用gcc保留中间编译结果
gcc -save-temps source.c -o my_programgcc的常用编译选项
完整的gcc用法可以通过man gcc命令进行查看
头文件路径选项:
-I:指定头文件的搜索路径。
多线程选项:
-pthread:启用POSIX线程支持。
代码生成选项:
-fPIC:生成位置无关代码。
-fno-stack-protector: 禁用栈保护。
-fno-exceptions: 禁用C++异常处理
编译目标架构选项:
-march:指定目标架构,如-march=native。
-m32:编译为32位目标。
-m64:编译为64位目标。警告相关:
—Wall: 开启大部分警告
—Werror:将警告视为错误
gcc使用方法进阶-静态库和动态库的创建:1、创建静态库的基本步骤:
1、编译源文件生成目标文件(.o文件):
gcc -c file1.c file2.c
2、创建静态库:
ar rcs libmylib.a file1.o file2.o
2、创建动态库的基本步骤:
1、编译源文件生成位置无关的目标文件:
gcc-fPIC-c file1.c file2.c
2、创建动态库:
gcc -shared -o libmylib.so file1.o file2.o
注意,创建动态库时需要加上-PIC选项,以生成位置无关的代码,以便在不同的内存地址中加载。
4、make命令
make是一个自动化构建工具,用于管理源代码的编译和构建过程。它可以根据规则和依赖关系自动确定哪些文件需要重新编译,从而使整个构建过程更加高效和自动化。make使用一个名为Makefile的文本文件来描述编译和构建规则。
Makefile文件:
Makefile定义了如何编译源代码、如何生成目标文件以及如何生成最终的可执行文件或库。Makefile使用一种类似于脚本的语法,其中包含了目标、依赖关系和命令。
Makefile基础:
目标(Target):目标是Makefile中的一个名称,表示您要构建的文件或操作。目标可以是可执行文件、库文件、伪目标(用于执行特定操作,如清理文件)等。
依赖关系(Dependencies): 每个目标可以有零个或多个依赖关系,表示生成该目标所需的其他文件或目标。依赖关系告诉make哪些文件在构建目标之前需要被更新或重新生成。
规则(Ruls):规则定义了如何从依赖关系生成目标文件的过程。规则包括目标、依赖关系和构建命令。
命令(Commands):命令是在规则中定义的一系列操作步骤,用于从依赖关系生成目标。命令通常以Tab开头,并列出了实际的编译、链接等操作。
变量(Variables):变量用于存储和传递值,使Makefile更具可维护性。您可以使用变量来存储编译器选项、源文件列表等。
注释(Comments):注释用于向Makefile添加说明,以便其他人理解构建过程和规则。Makefile内容例如:
CC=gcc CFLAGS =-Wall myprogram: main.c utils.c$(CC)$(CFLAGS)-o myprogram main.c utils.c clean:rm -f myprogrammake常用命令:
make-f: 用于指定一个不同于默认名称的Makefile文件来执行构建操作。
make-j N:使用多个并行任务进行构建,其中N是并行任务的数量。例如make-j4将使用4
个任务并行构建。
make-C dir:在指定的目录中执行make命令。例如make-C src将在src目录中执行构建。
make -B或make --always-make:强制重新构建目标,即使目标已经是最新的。这在需要强制重新构建的情况下很有用。cmake、gmake、qmake:
CMake(需要安装)是一个跨平台的构建工具,用于生成用于不同编译器和操作系统的构建文件(如Makefile、Visual Studio项目等)。使用一种类似脚本的语言来描述项目的构建过程,并生成相应的构建文件。CMake的一个主要优势是可以生成多种不同编译系统所需的构建文件。
gmake(GNU make)在不同的操作系统中也存在,但其Makefile文件在不同的平台上可能需要进行修改才能适应不同的编译器和操作系统。
qmake是Qt框架附带的构建工具,用于生成Qt项目的构建文件。它使用.pro文件来描述项目的配置和构建规则。qmake可以生成Makefile或Visual Studio项目文件,以便在不同平台上构建Qt项目。
5、软件编译过程中常见错误
依赖问题:缺少所需的依赖库或工具,导致编译过程失败。解决方法包括安装缺失的依赖、更新版本,或者指定正确的依赖路径。
编译器错误:编译器报错或警告,可能由于语法错误、类型不匹配等问题。解决方法涉及修改源代码以修复问题,确保代码符合编译器规范。
库路径问题:编译器找不到所需的库文件,可能是因为库路径未正确配置。解决方法包括指定正确的库路径、更新库链接等。
版本不兼容:编译代码可能与特定版本的库、编译器或操作系统不兼容。解决方法可能涉及更新或降级软件,以满足兼容性要求。
文件缺失或损坏:源代码或依赖文件可能缺失、损坏或下载不完整,导致编译失败。解决方法包括重新下载文件、修复文件损坏等 。……
6、conda基本概念介绍
conda是一个开源的包管理和环境管理工具,主要用于数据科学、机器学习和科学计算等领域。允许用户轻松创建、管理和分享不同的虚拟环境,以及安装和管理不同版本的软件包和库。
conda最初是Anaconda发行版中的一部分,后来作为一个独立的工具被广泛使用。
1.包版本管理:conda允许用户安装特定版本的软件包,并可以在不同版本之间切换。这对于确保项目在不同环境和平台上的一致性非常有用。
2.环境管理:conda支持创建和管理独立的虚拟环境。每个环境都可以有自己的依赖、配置和Python版本。这使得在同一台机器上同时管理多个项目变得更加容易。
3.虚拟环境集成:conda可以创建和管理虚拟环境,但也可以与其他虚拟环境工具(如virtualenv)集成,以提供更大的灵活性。conda的基本命令:
创建虚拟环境:conda create --name myenv
激活虚拟环境或进入虚拟环境:conda activate myenv
在虚拟环境中安装软件包:conda install numpy
列出已安装的软件包:conda list
卸载软件包:conda remove numpy
退出虚拟环境:conda deactivate删除虚拟环境:先执行退出虚拟环境的命令,再执行conda env remove --name 虚拟环境名。
创建环境配置文件:conda env export > environment.yml
从配置文件创建环境:conda env create -f environment.yml我创建的虚拟环境的路径:/home/服务器名称/anaconda3/envs/环境名称
可以通过conda-help或conda<subcommand>-help查看更详细的帮助信息与此相似的,virtualenv是一个非常有用的工具,特别适用于多项目开发环境中,它通过隔离环境、管理依赖和提供独立的Python版本等功能,使得Python项目开发更加灵活、可靠和可维护。
相关文章:
(二)掌握最基本的Linux服务器用法——Linux下简单的C/C++ 程序、项目编译
1、静态库与动态库 静态库(Static Library):静态库是编译后的库文件,其中的代码在编译时被链接到程序中,因此它会与程序一起形成一个独立的可执行文件。每个使用静态库的程序都会有自己的库的副本,这可能会导致内存浪费。常用后缀…...
应急响应-钓鱼邮件的处理思路溯源及其反制
0x00 钓鱼邮件的危害 1.窃取用户敏感信息,制作虚假网址,诱导用户输入敏感的账户信息后记录 2.携带病毒木马程序,诱导安装,使电脑中病毒木马等 3.挖矿病毒的传输,勒索病毒的传输等等 0x01 有指纹的钓鱼邮件的溯源处理…...
Hadoop Hbase Hive 版本对照一览
这里写目录标题 一、Hadoop 与 Hbase 版本对照二、Hadoop 与 Hive 版本对照 官网内容记录,仅供参考 一、Hadoop 与 Hbase 版本对照 二、Hadoop 与 Hive 版本对照...
Postgresql 基础使用语法
1.数据类型 1.数字类型 类型 长度 说明 范围 与其他db比较 Smallint 2字节 小范围整数类型 32768到32767 integer 4字节 整数类型 2147483648到2147483647 bigint 8字节 大范围整数类型 -9233203685477808到9223203685477807 decimal 可变 用户指定 精度小…...
Qt 之 QDebug,QString
文章目录 前言一、QDebug二、QString总结 前言 一、QDebug QDebug是Qt中用于进行调试和输出日志的类。它提供了一种便捷的方式来输出各种类型的数据,并可轻松地与流式输出一起使用,方便调试和查看程序的运行情况。 引入QDebug: 在使用QDebug…...
【C++】面试题
1、都说c是面向对象的语言,面向对象的三个特性能 [展开] 介绍一下吗? 封装:封装是一种集中管理的思想,把内部的数据和实现方法组合在一起,并且不对外暴漏内部的数据和实现方法,只对外提供几个接口来完成函数…...
机器学习算法之-逻辑回归(1)
什么是回归 回归树,随机森林的回归,无一例外他们都是区别于分类算法们,用来处理和预测连续型标签的算法。然而逻辑回归,是一种名为“回归”的线性分类器,其本质是由线性回归变化而来的,一种广泛使用于分类问…...
JAVA多线程和并发基础面试问答(翻译)
JAVA多线程和并发基础面试问答(翻译) java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序…...
正中优配:2023新股上市涨跌幅规则?新股上市涨跌幅限制为几天?
A股与美股不同,股票存在涨跌幅限制,那么,2023新股上市涨跌幅规矩?新股上市涨跌幅限制为几天?下面正中优配为我们预备了相关内容,以供参阅。 2023年新股上市涨跌幅存在以下规矩: 1、主板初次公开…...
如何查看线程在哪个cpu核上
1、ps -eLF查看PSR值 2、 taskset -pc $pid(进程/线程) 参考链接:https://blog.csdn.net/test1280/article/details/87993669...
【Vue前端】设置标题用于SEO优化
原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 1.vue全局配置2.创建并暴露getPageTitle方法3.通过全局前置守卫设置title4.页面上引用title5.项目使用中英文翻译,title失效 1.vu…...
maven install
maven install maven 的 install 命令,当我们的一个 maven 模块想要依赖其他目录下的模块时,直接添加会找不到对应的模块,只需要找到需要引入的模块,执行 install 命令,就会将该模块放入本地仓库,就可以进…...
Vue.js2+Cesium1.103.0 七、Primitive 绘制航线元素
Vue.js2Cesium1.103.0 七、Primitive 绘制航线元素 用 Primitive 绘制航线元素,包括航点图标,航线线段,线段距离标注,航点序号,海拔标注,总航程等信息。 可同时绘制多条航线;可根据 id 清除指…...
Mybatis 源码 ④ :TypeHandler
文章目录 一、前言二、DefaultParameterHandler1. DefaultParameterHandler#setParameters1.1 UnknownTypeHandler1.2 自定义 TypeHandler 三、DefaultResultSetHandler1. hasNestedResultMaps2. handleRowValuesForNestedResultMap2.1 resolveDiscriminatedResultMap2.2 creat…...
RabbitMQ和JMeter,一个完美的组合!优化你的中间件处理方式
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息中间件,它是基于Erlang语言编写的,并发能力强,性能好,是目前主流的消息队列中间件之一。 RabbitMQ的安装可参照官网( https://www.rabbitmq.c…...
WARNING: IPv4 forwarding is disabled. Networking will not work
当我在运行某条语句的时候 docker run -it -p 30001:22 --namecentos-ssh centos /bin/bash 提示 WARNING: IPv4 forwarding is disabled. Networking will not work. 解决: vim /usr/lib/sysctl.d/00-system.conf net.ipv4.ip_forward1 systemctl restart networ…...
SpringBoot复习:(40)@EnableConofigurationProperties注解的用法
一、配置文件: server.port9123 二、配置类: package cn.edu.tju.config;import com.mysql.fabric.Server; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.context.properties.EnableConfigu…...
Live Market是如何做跨境客户服务的?哪些技术赋能?
在面对不同的海外市场和用户群体时,如何进行有效地出海营销是跨境商家面临的挑战。其中消费者服务管理和卖家保障尤其关键,如何做好客户服务管理?包括处理好客户投诉,提升消费者满意度是所有跨境商家和品牌独立站卖家非常重视的问题。 在数字化浪潮席卷之下&#…...
2023年7月京东洗衣机行业品牌销售排行榜(京东数据分析软件)
2023年上半年,洗衣机市场表现平淡,同环比来看出货量都有一定程度的下滑。7月份,洗衣机市场仍未改变这一下滑态势。 根据鲸参谋电商数据分析平台的相关数据显示,7月份,京东平台洗衣机的销量为109万,环比下降…...
【0214】postgres后端进程session退出,如何通过日志分析其会话信息
文章目录 1. postgres进程session退出2. 开启日志记录postgres进程会话状态3. postgres进程会话结束,记录日志的实现原理1. postgres进程session退出 默认情况下,新建一个postgres后端进程会话(session),或是postgres进程正常/异常退出时,日志中没有很明显的记录用于说明…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
