(二)掌握最基本的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项目开发更加灵活、可靠和可维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/41730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv简单使用

cv2库安装&#xff0c; conda install opencv-python注意cv2使用时&#xff0c;路径不能有中文。&#xff08;不然会一直’None’ _ update # 处理中文路径问题 def cv_imread(file_path): #使用之前需要导入numpy、cv2库&#xff0c;file_path为包含中文的路径return cv2.imd…

idea入门与maven配置的一些介绍

idea入门与maven配置的一些介绍 1.确保Java和Maven已安装2.创建一个新的Maven项目3.导航到要创建项目的目录配置Maven4.配置项目的pom.xml文件5.配置其他Tomcat和设置jdk6.构建和运行项目 关于idea入门基础配置 步骤1&#xff1a;安装IntelliJ IDEA 首先&#xff0c;从IntelliJ…

计算机竞赛 python+大数据校园卡数据分析

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&am…

记录一个编译TubeTK时的报错:at_check问题

在使用如下命令安装TubeTK的cuda_nms时&#xff0c;报了一个错误&#xff0c;记录一下这个错误和解决办法 (base) redmeryredmery:~/Desktop/MOT/TubeTK/post_processing/nms$ python setup.py build_ext --inplace因为这个命令是在/home/redmery/Desktop/MOT/TubeTK/install/…

Talk | ACL‘23 杰出论文奖上海交通大学吴蔚琪:预训练语言模型对本体知识的记忆与理解

本期为TechBeat人工智能社区第523期线上Talk&#xff01; 北京时间8月17日(周四)20:00&#xff0c;上海交通大学硕士研究生—吴蔚琪的Talk已准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “预训练语言模型对本体知识的记忆与理解”&#xff0c;分享了预训…

Python入门【TCP建立连接的三次握手、 TCP断开连接的四次挥手、套接字编程实战、 TCP编程的实现、TCP双向持续通信】(二十七)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

【c语言】通讯录(动态版+文件+背景音乐)含源码

开饭了&#xff0c;之前写的通讯录&#xff0c;是否会有人觉得申请1000人的空间是不是有点用不上呀&#xff0c;怎么才能做到要多少申请多少个呢&#xff1f;&#xff1f;我们学完动态内存管理&#xff0c;和文件的相关操作&#xff0c;终于可以继续完善我们的通讯录了 船新版本…

数据结构:二叉树的递归实现(C实现)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》 文章目录 前言一、树的概念二、二叉树二叉树的概念二叉树的性质 三、二叉树链式结构实现二叉树节点定义创建二叉树节点遍历二叉树先序遍历二叉树(BinaryTreePrevOrder)中序遍历二叉树(BinaryTree…

Air780EG —— 合宙4G定位解决方案

定位模式&#xff1a; 外部单片机控制模式(常见于AT固件客户)&#xff1a; 开机 -> 搜星 -> 定位成功 -> 上报 -> 关机 780E自行控制模式(常见于二次开发客户&#xff0c;AT用户也可以使用): 开机 -> 搜星 -> 定位成功 -> 模块休眠&#xff0c;关闭GP…

亿发创新中医药信息化解决方案,自动化煎煮+调剂,打造智能中药房

传统中医药行业逐步复兴&#xff0c;同时互联网科技和人工智能等信息科技助力中医药行业逐步实现数字化转型。利用互联网、物联网、大数据等科技&#xff0c;实现现代科学与传统中医药的结合&#xff0c;提供智能配方颗粒调配系统、中药自动化调剂系统、中药煎配智能管理系统、…

如何切换goland之中的版本号(升级go 到1.20)

go 安装/版本切换_go 切换版本_云满笔记的博客-CSDN博客 用brew就行&#xff1a; echo export PATH"/opt/homebrew/opt/go1.20/bin:$PATH" >> ~/.zshrc

Linux6.40 Kubernetes 配置资源管理

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes 配置资源管理一、Secret1.Secret 四种类型1&#xff09;kubernetes.io/service-account-token2&#xff09;Opaque3&#xff09;kubernetes.io/dockerconfigjson4&#xff09;kubernetes.io/tls 2.Pod 需要先引用才能使用某…

React入门 jsx学习笔记

一、JSX介绍 概念&#xff1a;JSX是 JavaScript XML&#xff08;HTML&#xff09;的缩写&#xff0c;表示在 JS 代码中书写 HTML 结构 作用&#xff1a;在React中创建HTML结构&#xff08;页面UI结构&#xff09; 优势&#xff1a; 采用类似于HTML的语法&#xff0c;降低学…

因果推断(四)断点回归(RD)

因果推断&#xff08;四&#xff09;断点回归&#xff08;RD&#xff09; 在传统的因果推断方法中&#xff0c;有一种方法可以控制观察到的混杂因素和未观察到的混杂因素&#xff0c;这就是断点回归&#xff0c;因为它只需要观察干预两侧的数据&#xff0c;是否存在明显的断点…

【C++入门到精通】C++入门 —— list (STL)

阅读导航 前言一、list简介1.概念2.特点 二、list的使用1.list的构造2.常见的操作⭕std::list类型的增、删、查、改 三、list与vector的对比温馨提示 前言 文章绑定了VS平台下std::list的源码&#xff0c;大家可以下载了解一下&#x1f60d; 前面我们讲了C语言的基础知识&…

C语言实例_获取文件MD5值

一、MD5介绍 MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常用的哈希函数算法。将任意长度的数据作为输入&#xff0c;并生成一个唯一的、固定长度&#xff08;通常是128位&#xff09;的哈希值&#xff0c;称为MD5值。MD5算法以其高度可靠性和广泛应用而闻名…

全球磁强计市场价值约为16.2亿美元,预测期内将以超过5.21%的增长率增长

磁强计是一种用于测量磁场强度和方向的仪器。它可以检测和测量地球磁场、物体的磁性、地下矿藏、磁性材料等。磁强计在地球科学、物理学、地质学、勘探、矿业等领域具有广泛的应用。 根据阿谱尔&#xff08;APO&#xff09;的统计及预测&#xff0c;2022年全球磁强计市场价值约…

ts与vue

ts与Vue 如果你已经学习了typeScript,但不知道如何在vue项目中使用&#xff0c;那么这篇文章将会很适合你。参考千峰教育 kerwin视频 1.会自动推导&#xff0c;隐士推导。提示 类型系统。 独立模块。 isolatedModules选项&#xff1a;是否配置为独立的模块。 减少报错 let …

dispatcherServlet在tomcat启动时如何被加载(1)

目录 在springboot工程中, 如何添加一个servlet呢? 方法1 : 使用WebServlet注解 方法2 : 使用ServletRegistrationBean进行注册 springmvc 采用的就是方式2和springboot集成的, 看一下源码 springboot 字段装配里面有这个类, 看一下源码 90行, 创建了一个DispatcherServlet对象…