当前位置: 首页 > news >正文

(二)掌握最基本的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_program

gcc的常用编译选项

完整的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 myprogram 

make常用命令:

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)&#xff1a;静态库是编译后的库文件&#xff0c;其中的代码在编译时被链接到程序中&#xff0c;因此它会与程序一起形成一个独立的可执行文件。每个使用静态库的程序都会有自己的库的副本&#xff0c;这可能会导致内存浪费。常用后缀…...

应急响应-钓鱼邮件的处理思路溯源及其反制

0x00 钓鱼邮件的危害 1.窃取用户敏感信息&#xff0c;制作虚假网址&#xff0c;诱导用户输入敏感的账户信息后记录 2.携带病毒木马程序&#xff0c;诱导安装&#xff0c;使电脑中病毒木马等 3.挖矿病毒的传输&#xff0c;勒索病毒的传输等等 0x01 有指纹的钓鱼邮件的溯源处理…...

Hadoop Hbase Hive 版本对照一览

这里写目录标题 一、Hadoop 与 Hbase 版本对照二、Hadoop 与 Hive 版本对照 官网内容记录&#xff0c;仅供参考 一、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中用于进行调试和输出日志的类。它提供了一种便捷的方式来输出各种类型的数据&#xff0c;并可轻松地与流式输出一起使用&#xff0c;方便调试和查看程序的运行情况。 引入QDebug&#xff1a; 在使用QDebug…...

【C++】面试题

1、都说c是面向对象的语言&#xff0c;面向对象的三个特性能 [展开] 介绍一下吗&#xff1f; 封装&#xff1a;封装是一种集中管理的思想&#xff0c;把内部的数据和实现方法组合在一起&#xff0c;并且不对外暴漏内部的数据和实现方法&#xff0c;只对外提供几个接口来完成函数…...

机器学习算法之-逻辑回归(1)

什么是回归 回归树&#xff0c;随机森林的回归&#xff0c;无一例外他们都是区别于分类算法们&#xff0c;用来处理和预测连续型标签的算法。然而逻辑回归&#xff0c;是一种名为“回归”的线性分类器&#xff0c;其本质是由线性回归变化而来的&#xff0c;一种广泛使用于分类问…...

JAVA多线程和并发基础面试问答(翻译)

JAVA多线程和并发基础面试问答(翻译) java多线程面试问题 1. 进程和线程之间有什么不同&#xff1f; 一个进程是一个独立(self contained)的运行环境&#xff0c;它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序…...

正中优配:2023新股上市涨跌幅规则?新股上市涨跌幅限制为几天?

A股与美股不同&#xff0c;股票存在涨跌幅限制&#xff0c;那么&#xff0c;2023新股上市涨跌幅规矩&#xff1f;新股上市涨跌幅限制为几天&#xff1f;下面正中优配为我们预备了相关内容&#xff0c;以供参阅。 2023年新股上市涨跌幅存在以下规矩&#xff1a; 1、主板初次公开…...

如何查看线程在哪个cpu核上

1、ps -eLF查看PSR值 2、 taskset -pc $pid&#xff08;进程/线程&#xff09; 参考链接&#xff1a;https://blog.csdn.net/test1280/article/details/87993669...

【Vue前端】设置标题用于SEO优化

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 1.vue全局配置2.创建并暴露getPageTitle方法3.通过全局前置守卫设置title4.页面上引用title5.项目使用中英文翻译&#xff0c;title失效 1.vu…...

maven install

maven install maven 的 install 命令&#xff0c;当我们的一个 maven 模块想要依赖其他目录下的模块时&#xff0c;直接添加会找不到对应的模块&#xff0c;只需要找到需要引入的模块&#xff0c;执行 install 命令&#xff0c;就会将该模块放入本地仓库&#xff0c;就可以进…...

Vue.js2+Cesium1.103.0 七、Primitive 绘制航线元素

Vue.js2Cesium1.103.0 七、Primitive 绘制航线元素 用 Primitive 绘制航线元素&#xff0c;包括航点图标&#xff0c;航线线段&#xff0c;线段距离标注&#xff0c;航点序号&#xff0c;海拔标注&#xff0c;总航程等信息。 可同时绘制多条航线&#xff1b;可根据 id 清除指…...

Mybatis 源码 ④ :TypeHandler

文章目录 一、前言二、DefaultParameterHandler1. DefaultParameterHandler#setParameters1.1 UnknownTypeHandler1.2 自定义 TypeHandler 三、DefaultResultSetHandler1. hasNestedResultMaps2. handleRowValuesForNestedResultMap2.1 resolveDiscriminatedResultMap2.2 creat…...

RabbitMQ和JMeter,一个完美的组合!优化你的中间件处理方式

RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息中间件&#xff0c;它是基于Erlang语言编写的&#xff0c;并发能力强&#xff0c;性能好&#xff0c;是目前主流的消息队列中间件之一。 RabbitMQ的安装可参照官网&#xff08; 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. 解决&#xff1a; vim /usr/lib/sysctl.d/00-system.conf net.ipv4.ip_forward1 systemctl restart networ…...

SpringBoot复习:(40)@EnableConofigurationProperties注解的用法

一、配置文件&#xff1a; server.port9123 二、配置类&#xff1a; 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是如何做跨境客户服务的?哪些技术赋能?

在面对不同的海外市场和用户群体时,如何进行有效地出海营销是跨境商家面临的挑战。其中消费者服务管理和卖家保障尤其关键&#xff0c;如何做好客户服务管理?包括处理好客户投诉,提升消费者满意度是所有跨境商家和品牌独立站卖家非常重视的问题。 在数字化浪潮席卷之下&#…...

2023年7月京东洗衣机行业品牌销售排行榜(京东数据分析软件)

2023年上半年&#xff0c;洗衣机市场表现平淡&#xff0c;同环比来看出货量都有一定程度的下滑。7月份&#xff0c;洗衣机市场仍未改变这一下滑态势。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;7月份&#xff0c;京东平台洗衣机的销量为109万&#xff0c;环比下降…...

【0214】postgres后端进程session退出,如何通过日志分析其会话信息

文章目录 1. postgres进程session退出2. 开启日志记录postgres进程会话状态3. postgres进程会话结束,记录日志的实现原理1. postgres进程session退出 默认情况下,新建一个postgres后端进程会话(session),或是postgres进程正常/异常退出时,日志中没有很明显的记录用于说明…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…...