linux什么是编译安装linux运维

编译安装,就是使用源代码,根据机器自身的硬件、内核、环境进行编译,生成二进制文件,优点是不管什么机器,只要有完整的编译环境(基本上所有的Linux发行版都有自己的一套完整的编译环境),就可以生成适合自己机器的二进制包,同时因为是针对本机软硬件环境编译的,生成的二进制程序运行起来理论上性能更好,更节省资源。

说明:

源码要运行,必须先转成二进制的机器码。这是编译器的任务。

比如,下面这段源码(假定文件名叫做test.c)。

编译器在开始工作之前,需要知道当前的系统环境,比如标准库在哪里、软件的安装位置在哪里、需要安装哪些组件等等。这是因为不同计算机的系统环境不一样,通过指定编译参数,编译器就可以灵活适应环境,编译出各种环境都能运行的机器码。这个确定编译参数的步骤,就叫做"配置"(configure)。

这些配置信息保存在一个配置文件之中,约定俗成是一个叫做configure的脚本文件。通常它是由autoconf工具生成的。编译器通过运行这个脚本,获知编译参数。

configure脚本已经尽量考虑到不同系统的差异,并且对各种编译参数给出了默认值。如果用户的系统环境比较特别,或者有一些特定的需求,就需要手动向configure脚本提供编译参数。

源码肯定会用到标准库函数(standardlibrary)和头文件(header)。它们可以存放在系统的任意目录中,编译器实际上没办法自动检测它们的位置,只有通过配置文件才能知道。

编译的第二步,就是从配置文件中知道标准库和头文件的位置。一般来说,配置文件会给出一个清单,列出几个具体的目录。等到编译时,编译器就按顺序到这几个目录中,寻找目标。

对于大型项目来说,源码文件之间往往存在依赖关系,编译器需要确定编译的先后顺序。假定A文件依赖于B文件,编译器应该保证做到下面两点。

在确定依赖关系的同时,编译器也确定了,编译时会用到哪些头文件。

预编译完成后,编译器就开始替换掉源码中bash的头文件和宏。以本文开头的那段源码为例,它包含头文件stdio.h,替换后的样子如下。

这一步称为"预处理"(Preprocessing),因为完成之后,就要开始真正的处理了。

预处理之后,编译器就开始生成机器码。对于某些编译器来说,还存在一个中间步骤,会先把源码转为汇编码(assembly),然后再把汇编码转为机器码。

下面是本文开头的那段源码转成的汇编码。

注:make(gcc),其调用gcc执行编译的过程依赖于配置文件makefile

对象文件还不能运行,必须进一步转成执行文件。如果你仔细看上一步的转码结果,会发现其中引用了stdout函数和fwrite函数。也就是说,程序要正常运行,除了上面的代码以外,还必须有stdout和fwrite这两个函数的代码,它们是由C语言的标准库提供的。

编译器的下一步工作,就是把外部函数的代码(通常是后缀名为.lib和.a的文件),添加到可执行文件中。这就叫做连接(linking)。这种通过拷贝,将外部函数库添加到可执行文件的方式,叫做静态连接(staticlinking),后文会提到还有动态连接(dynamiclinking)。

make命令的作用,就是从第四步头文件预编译开始,一直到做完这一步。

上一步的连接是在内存中进行的,即编译器在内存中生成了可执行文件。下一步,必须将可执行文件保存到用户事先指定的安装目录。

可执行文件安装后,必须以某种方式通知操作系统,让其知道可以使用这个程序了。比如,我们安装了一个文本阅读程序,往往希望双击txt文件,该程序就会自动运行。

这就要求在操作系统中,登记这个程序的元数据:文件名、文件描述、关联后缀名等等。Linux系统中,这些信息通常保存在/usr/share/applications目录下的.desktop文件中。另外,在Windows操作系统中,还需要在Start启动菜单中,建立一个快捷方式。

这些事情就叫做"操作系统连接"。makeinstall命令,就用来完成"安装"和"操作系统连接"这两步。

写到这里,源码编译的整个过程就基本完成了。但是只有很少一部分用户,愿意耐着性子,从头到尾做一遍这个过程。事实上,如果你只有源码可以交给用户,他们会认定你是一个不友好的家伙。大部分用户要的是一个二进制的可执行程序,立刻就能运行。这就要求开发者,将上一步生成的可执行文件,做成可以分发的安装包。

正常情况下,到这一步,程序已经可以运行了。至于运行期间(runtime)发生的事情,与编译器一概无关。但是,开发者可以在编译阶段选择可执行文件连接外部函数库的方式,到底是静态连接(编译时连接),还是动态连接(运行时连接)。所以,最后还要提一下,什么叫做动态连接。

前面已经说过,静态连接就是把外部函数库,拷贝到可执行文件中。这样做的好处是,适用范围比较广,不用担心用户机器缺少某个库文件;缺点是安装包会比较大,而且多个应用程序之间,无法共享库文件。动态连接的做法正好相反,外部函数库不进入安装包,只在运行时动态引用。好处是安装包会比较小,多个应用程序可以共享库文件;缺点是用户必须事先安装好库文件,而且版本和安装位置都必须符合要求,否则就不能正常运行。

现实中,大部分软件采用动态连接,共享库文件。这种动态共享的库文件,Linux平台是后缀名为.so的文件,Windows平台是.dll文件,Mac平台是.dylib文件。

1.编译安装源程序的前提:

1).提供开发环境:开发工具和开发库

2).编译安装需要的包组:

1)、展开源代码,找INSTALL、README;不存在此类文件时,找项目官方文档;

2)、根据安装说明执行安装操作;

4.程序安装于专用目录时,安装后的配置:

1)、导出二进制程序所在路径至PATH环境中

OS查找库文件方法:根据/etc/ld.so.conf配置文件指定的路径搜索,或搜索/lib,/lib64,/usr/lib,/usr/lib64,把查找到的所有的库文件路径和其名称映射关系保存为一个缓存文件/etc/ld.so.cache;

/etc/ld.so.conf配置文件有其它组成部分:/etc/ld.so.conf.d/*.conf

假设nginx安装于/usr/local/nginx,此目录中有其库文件子目录lib,导出此目录中库文件:

(1)新建文件/etc/ld.so.conf.d/nginx.conf,在文件添加如下行:

ldconfig的主要用途:

默认搜寻/lilb和/usr/lib,以及配置文件/etc/ld.so.conf内所列的目录下的库文件。

搜索出可共享的动态链接库,库文件的格式为:lib***.so.**,进而创建出动态装入程序(ld.so)所需的连接和缓存文件。

缓存文件默认为/etc/ld.so.cache,该文件保存已排好序的动态链接库名字列表。

ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。

常用选项:

(a)、往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf文件的,但是添加完后需要调用下ldconfig,不然添加的library会找不到。

(b)、如果添加的library不在/lib和/usr/lib里面的话,就一定要修改/etc/ld.so.conf文件,往该文件追加library所在的路径,然后也需要重新调用下ldconfig命令。比如在安装mysql的时候,其库文件/usr/local/mysql/lib,就需要追加到/etc/ld.so.conf文件中。命令如下:

(3)、帮助文件导出

man命令搜索特定路径查找手册页文件,这些路径是定义在/etc/man.config中的MANPATH参数所指定的路径下的;

新增办法:编辑/etc/man.config文件,新增一个MANPATH参数,其值为新安装程序的man手册所在的目录;

导出独立安装应用程序的头文件方法:创建链接至/usr/include下即可;

THE END
1.高效文件处理:Pythonpathlib实战指南# path 对象 # WindowsPath('D:/temp/pathlib') 构造路径对象之后,Path会自动判断出是windows还是linux下的路径。 1.2. 拼接和拆分路径 用字符串来拼接和拆分路径时,最麻烦的就是不同系统中路径分隔符(\ 和 /)的处理。 使用Path对象,能够避免此困扰。 https://blog.csdn.net/fenfenfen520a/article/details/144423375
2.LINUX随笔二十一添加动态库路径的方法/lib -ltest -Wl,-rpath ./lib) ,其中,-Wl的意思是,后面的选项直接交给ld程序处理,-rpath选项是说更改搜索路径为后面的参数 ./lib b.环境变量LD_LIBRARY_PATH指定的动态库搜索路径; c.配置文件/etc/ld.so.conf中指定的动态库搜索路径;(修改完文件后,用ldconfig更新) d.默认的动态库搜索路径/lib和/usr/https://www.ctyun.cn/zhishi/p-409896
3.C++标准库实现wx639dba20b70fd的技术博客C++标准库(Standard Library)是C++语言的重要组成部分,提供了丰富的数据结构和算法,极大地简化了开发过程。本文将深入探讨C++标准库的实现机制,并通过代码实例帮助读者更好地理解和应用这些概念。 一、标准库概述 C++标准库由多个头文件组成,每个头文件包含一组相关的类和函数。以下是一些常用的头文件及其功能: https://blog.51cto.com/u_15916160/12771707
4.Pythonpython源码下载平台```python # 导入模块 import os # 定义变量 my_variable = "Hello, World!" # 创建一个工作空间 workspace = {} # 将变量添加到工作空间 workspace["key"] = my_variable # 访问工作空间中的变量 print(workspace["key"]) ``` 在这个示例中,我们首先导入了os模块,然后定义了一个名为my_variable的变https://python.code.coder100.com/index/index/content/id/59882
5."dicts.lsp"文件详解与应用指南导读本文将详细介绍"dicts.lsp"文件的构成、功能及应用。首先,我们将概述"dicts.lsp"文件的基本概念及其在编程中的作用。接着,我们将深入探讨 本文将详细介绍"dicts.lsp"文件的构成、功能及应用。首先,我们将概述"dicts.lsp"文件的基本概念及其在编程中的作用。接着,我们将深入探讨文件的结构和语法规则,帮助读http://m.caohai.net/hlkj/202412/187982.html
6.LogicalDatabases逻辑数据库数据库表(T类型节点):节点名称(上图中的根节点名称输入框)必须为数据库表名(上图中的数据库表输入框)或者view,且不可以为纵深结构。此类型(数据库表或视图)的节点情况下,可执行程序里,你可以使用NODES or TABLES语句来定义工作区,在LDB的数据库程序中,需要对每个节点使用NODESor TABLES来定义,不能有TYPE选项。https://www.u72.net/daima/n3uvr.html
7.解析java.library.path和LDLIBRARYPATH的介绍与区别java为什么有LD_LIBRARY_PATH? 上面我们说到可以通过cache和ldconfig来简化搜索和加载动态库的流程,但是还有两个问题没有考虑到,一是还没有将编出来的库放到系统目录中去,二是依赖库数量很少,不需要经过这么复杂的查找。 LD_LIBRARY_PATH就是用来满足这个需要,它也指定一个搜索路径,且ld-linux.so会优先在这个路径下搜https://m.jb51.net/article/211890.htm
8.深入理解Linux动态库加载:路径问题与解决方案这个命令会将/path/to/libs添加到LD_LIBRARY_PATH的开始,动态链接器会首先在这个目录中搜索动态库。 4.4 修改/etc/ld.so.conf文件 /etc/ld.so.conf文件是一个包含动态库搜索路径的配置文件。动态链接器会在这些路径中搜索动态库。你可以编辑这个文件 https://developer.aliyun.com/article/1466188
9.linuxLDLIBRARYPATHdoesn'tseemtowork/usr/bin/ld: cannot find -lg2c If I use: gcc -o test test.c -L/usr/lib/gcc/x86_64-redhat-linux/3.4.6 -lg2c then it works fine. So I added the path like so: LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/3.4.6:$LD_LIBRARY_PATH https://stackoverflow.com/questions/13292261/ld-library-path-doesnt-seem-to-work
10.更改当前进程环境的LDLIBRARYPATHPython开发问题这篇关于更改当前进程环境的 LD_LIBRARY_PATH的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!https://www.genban.org/ask/python/48271.html
11.LDLIBRARYPATH变量设置hxlexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib export PATH=$ORACLE_HOME/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/b in:/sbin umask 022 export PATH unset USERNAME 明明是设置了LD_LIBRARY_PATH变量的,怎么不生效呢,后来在.bashrc文件中添加该变量问题解决. http://blog.chinaunix.net/uid-77311-id-3268488.html
12.ORACLEHOME迁移后需要设置LDLIBRARYPATH环境变量在10g以后,一般情况下环境变量中没有必要设置LD_LIBRARY_PATH,但是一旦将ORACLE_HOME迁移到其他目录,则环境变量中还需要添加这个变量。 Linux和Unix支持TAR方式迁移ORACLE_HOME,如果有需要将ORACLE_HOME放到其他路径下,那么一般都会使用tar的方式将整个路径拷贝到目标目录。 https://blog.itpub.net/4227/viewspace-718879/
13.图像质量调试工具使用指南.docx运行前准killallittbstream;ittbstreamDLLPATH=${LDLIBRARYPATH}:${PWD}/libs;#exportLDLIBRARYPATH=${DLLPATH}#exportLDLIBRARYPATH即Linux环境变量名,该环境变量主要用于指定查找共享库(动态工具里使用了自己编译好的动态库,而这些动态库放在发布包的libs文件夹下。当执行函数动态 下’/lib’and‘/usr/lib’,那么https://www.renrendoc.com/paper/243693177.html
14.科学网—Linux操作系统中编译安装GCC详解以及需要注意的问题1.3 上面装的3个库,GCC找不到,需要设置变量 LD_LIBRARY_PATH export LD_LIBRARY_PATH=/usr/local/lib (在终端里运行这行命令, 下次开机失效) 或更改~/.profile文件,在文件的最后加上一行: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib (需先注销,永久有效) https://blog.sciencenet.cn/blog-830496-699204.html
15.PaddlePaddle/PaddleSeg:飞桨高性能图像分割开发套件,端到端完成python deploy/python/infer.py \ --config ./pp_liteseg_infer_model/deploy.yaml \ --image_path ./cityscapes_demo.png 参数说明如下: 参数名用途是否必选项默认值 config导出模型时生成的配置文件, 而非configs目录下的配置文件是- image_path预测图片的路径或者目录或者文件列表是- https://openi.pcl.ac.cn/PaddlePaddle/PaddleSeg/src/branch/release/2.7/docs/deployment/inference/python_inference_cn.md
16.RPATH–demonstrate的blog比较推荐的做法是链接的时候加入 -rpath 参数指明所谓的 RUNPATH,这样可执行文件(或者依赖其他动态链接库的动态链接库)就能告诉 ld.so 到哪里去搜索对应的动态链接库了。对于没有设定 RPATH 的可执行文件或者动态链接库,我们可以用 LD_LIBRARY_PATH 这个环境变量通知 ld.so,这个方法的问题是,环境变量有时候设置了(https://remonstrate.wordpress.com/tag/rpath/
17.鲲鹏GPU生态应用Relion移植指南(CentOS8.2)技术分享专区./configure --prefix=/path/to/FFTW --enable-shared --enable-threads --enable-openmp --enable-mpi CFLAGS="-O3 -fomit-frame-pointer -fstrict-aliasing" make -j && make install 步骤6 执行以下命令配置环境变量: export PATH=/path/to/FFTW/bin:$PATH export LD_LIBRARY_PATH=/path/to/FFTW/libhttps://developer.huawei.com/home/forum/kunpeng/thread-0207101461153257010-1-1.html
18.FAQ《PaddleOCRv2.0使用教程》A:需要把cudnn lib添加到LD_LIBRARY_PATH中去。 Q3.1.4:PaddlePaddle怎么指定GPU运行 os.environ[“CUDA_VISIBLE_DEVICES”]这种不生效 A:通过设置 export CUDA_VISIBLE_DEVICES=’0’环境变量 Q3.1.5:windows下训练没有问题,aistudio中提示数据路径有问题 https://www.bookstack.cn/read/PaddleOCR-2.0-zh/3e138bdc40f16673.md
19.关于LDLIBRARYPATH的问题东写西读终见大海无量据说因为安全原因,Linux系统做了限制。LD_LIBRARY_PATH not loading from .profile nor /etc/environment Ubuntu 不能在 profile, environment,.bashrc中设置 LD_LIBRARY_PATH; 解决办法: 编辑/etc/ld.so.conf 文件,将指定的路径加上,或者在 /etc/ld.so.conf.d/ 目录中添加一个新的配置文件。 https://www.iteye.com/blog/yangzb-598700