库:程序代码的集合,是共享程序代码的一种方式(库分为开源库和闭源库)
为什么c/c++开源库使用前需要编译:直接将第三方库的源代码包含到当前程序的代码中编译是效率非常低下的方式,实际中除非极特殊情况,不会考虑使用这种方式,而是将开源库源代码编译成二进制的动态链接库,其他程序要使用其中的API时,只需要指定动态链接库的入口点,程序运行时加载动态链接库 并找到其中的函数入口点就可以调用开源库API。
闭源库:不公开源代码,只公开接口,看不到具体实现,比如高德地图,环信即时通讯等的SDK.(闭源库分为静态库和动态库)
静态库:以".a"或".framework"为文件后缀名,静态库链接时会被完整的复制到可执行文件中,被多次使用就有多次拷贝
动态库:以".dylib"或".framework"为文件后缀名,动态库链接时不复制,程序运行时由系统动态加载到内存,供程序调用。而且系统只加载一次,多个程序共用,节省内存。
$(prefix) = /usr/local()./configure --prefix=$(prefix)/lib${prefix}/bin。
./configure && make && make install
Linux下有两种库:动态库和静态库(共享库)
二者不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已被载入可执行程序(二进制文件)(编译时库文件需通过-L参数传递给编译器)因此拥有静态函数库的软件较为庞大。程序运行时将不再需要该静态库,因为所有使用的函数都已经被编译进去了,即拥有静态函数库的软件可以独立运行。如果静态函数库改变了,那么你的程序必须重新编译才能正常使用。 这是非常麻烦的! 动态库(共享库)的代码在可执行程序运行时才载入内存,函数库没有被整合进你的程序,因此程序的运行环境还需要提供动态库,在编译时仅仅将函数库的路径整合到软件的二进制文件中去。由于软件中包含的是函数库的路径(动态库链接时,它只是保留接口,这样可提高代码的可复用度。),因此该软件无法独立运行,且函数库的路径不能发生变化,一旦变化,该软件将无法找到函数库,从而无法运行!这是动态函数库的最大缺点。但当动态函数库更新时,软件无需重新编译,因此更新较为方便,这是动态函数库的最大优点。目前大部分软件均使用动态函数库,就是因为动态函数库在更新时体现出的优势。
静态库名字一般是libxxx.a
动态库名字一般是libxxx.so
linux上可以选择从源代码安装和只安装库文件两种方式。从源代码安装是指从OpenCV官网中下载相应版本的OpenCV源码,然后使用cmake命令中编译安装,好处是可以选择的版本比较丰富,而且可以看到源代码;只安装库文件,是指安装由Ubuntu社区人员编译好的库文件,这样就无需重新编译一遍。
源码包的缺点:因为是编译安装,安装过程中一旦报错新手很难解决源码包的优点是开源,如果有足够的能力,可以修改源代码。软件是编译安装,所以更加适合自己的系统。
二进制包(RPM包、系统默认包)缺点:经过编译,不再可以看到源代码
Yum安装可以自动解决库依赖问题,所以推荐使用。
source code 是程序员跑的码, binary code 是机器跑的代码。 source code 得经过 compile 才能成為 binary code 。
CentOS7主要有rpm和yum这两种包软件的管理。RPM 有分兩种:binary rpm 跟 source rpm 。 前者是編好的 binary ,安裝就可用。 后者是还沒編好的 source ,需 rebuild 之後才能安裝。rpm格式很好区分,二进制格式的包名字很长,都带有版本号、适应平台、适应的硬件类型等,而源码格式仅仅就是一个版本号的tar包。mysql-5.0.45.tar.gz 是 源码包 像这样的 mysql-5.0.45-linux-x86_64-glibc23.tar.gz 是二进制包。
Linux安装方式有两种,YUM安装(yum方式安装:(安装rpm包),rpm最早由RedHat公司提出的软件包标准,后来随着rpm的不断发展而又增加许多功能,逐渐的成为linux公认的软件包管理标准。 Yum(全称为 Yellow dogUpdater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。而且现在的发行版都有自己的包管理器,比如apt(apt方式安装:(安装deb包)rpm 只能安装已经下载到本地机器上的rpm 包. yum能在线下载并安装rpm包,能更新系统, 且还能自动处理包与包之间的依赖问题,这个是rpm 工具所不具备的。)或yum,一个命令就可以从源下载软件,还可以自动解决依赖问题。)和源代码安装方式。推荐使用YUM安装方式。众做周知RedHat Linux使用RPM包管理器安装rpm包,但是RPM包是由红帽编译打包的,通常相对于最新版落后了很多,甚至可能缺少我们所要使用的功能。如果你需要定制想要的软件功能、自定义安装路径、体验最新版等,你就需要自己动手编译安装源码包了。
而且对于Linux初学者来说,安装 软件是一件很让人头疼的事情。由于很多Linux应用软件都是以源代码的形式发布的,这就要求用户根据自己系统的实际情况和自身的需要来配置,编译源程序 后,才能使用这些软件,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。目前流行的软件包有两种比较常见的形式,一种是以 RPM、deb包为代表的智能软件包,另一种是file.tar.gz形式的压缩。本文将讨论file.tar.gz的安装方法以及智能软件包在文本环境和图形环境下的安装方法。
一.源代码安装(查看INSTALL与README文件,这两个文件中详细介绍了本软件的安装方法和注意事项。其实在解压完一个包后,打开文件夹可以找到INSTALL 或者README 文件 里面才是详细的安装步骤!!!):应用软件的源代码一般是file.tar.gz或者file.tgz格式,进入解压完成之后新建立的目录,一般的应用软件中都有一个用来配置软件的可执行文件——configure,Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(make install)。Configure是一个可执行脚本(./configure的作用是检测系统配置,生成makefile文件),它有很多选项(参数),当 然,安装不同的软件参数也不相同,具体有些什么参数,在待安装的源码路径下使用命令./configure –-help输出详细的选项列表。例如./configure --prefix=/usr/local/mysql(表示设置软件的安装目录为:/usr/local/mysql,可以把所有资源文件放在/usr/local/mysql的路径中,不会杂乱。)。(其中--prefix选项是配置安装的路径,如果不配置该选项,安装后可执行文件默认放在/usr /local/bin,库文件默认在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr /local/share,比较凌乱。). 这里以安装supersparrow-0.0.0为例,我们打算把它安装到 到目录/usr/local/supersparrow,于是在supersparrow-0.0.0目录执行带选项的脚本./configure --prefix=/usr/local/supersparrow,执行成功后再编译、安装(make,make install)(执行make clean;make命令将源码编译成二进制文件。PS:make clean命令用来清除上一次编译生成的目标文件。这个步骤可有可无,但为了确保编译的成功,还是加上为好。防止由于软件中含有残留的目标文件导致编译失败。执行make install命令将上一步编译好的二进制文件安装到指定的目录中去。此时二进制文件会被安装到先前configure prefix参数设置的路径中去。 –prefix参数指定软件安装目录。当执行make install命令时,会将软件安装在此路径中。 )。在运行#./configure [options]配置软件后,它会根据你当前系统、编译、安装相关的信息,生成一个安装配置文件Makefile。Makefile文件通常是用来编译 软件的,运行make命令时系统会自动根据Makefile文件中的设置对软件进行编译,如果编译能够顺利通过的话,运行#make install命令来安装。(到此程序就算安装完成了,但是不要忘了还有后续的配置哦)安装完成将自动生成目录supersparrow,而且该软件所有的文件都被复制到这个目录。为什么要指定这个安装目录?是为了以后的维护方便,如果没有用这个选项,安装过程结束后,该软件所需的软件被复制到不同的系统目录下,很难弄清楚到底复制了那些文件、都复制到哪里去了—基本上是一塌糊涂。用了—prefix选项的另一个好处是卸载软件或移植软件。当某个安装的软件不再需要时,只须简单的删除该安装目录,就可以把软件卸载得干干净净;移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统)。
二、智能包安装
现在,以智能包形式提供的软件很多,像RedHat Linux的RPM、Debian Linux的DEB、KISS、BSD以及Slackware等。RPM和Debian几乎统治着Linux包管理世界,它们是首先被大多数商业 Linux发行版本所广泛采用的应用软件。下面笔者就介绍一下如何安装以RPM和Deb格式打包的软件。RPM是RedHat Package Manager的缩写,它只能使用在安装了RPM软件的系统中,不过好像目前大多数中文Linux发行版本都支持RPM软件包。1.用命令管理#rpm [options] abc.rpm 例如安装python-1.5.2-35.i386.rpm软件时,可以使用如下命令:#rpm –ivh python-1.5.2-35.i386.rpm。如果你想知道RPM软件包中的相关信息,可以使用命令:#rpm ivh python-1.5.2-35.i386.rpm。
/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!/
Linux源码安装的文件默认的存放路径:如果是别人发布的二进制包,可执行文件通常都安装到Linux系统 /usr/bin 下面;如果是自己从源代码安装的,可执行文件通常都在 /usr/local/bin 下面,除非配置时指定了安装位置。
例如: rpm -ivh xxx1.rpm 可执行文件通常都安装到 /usr/bin 下面
./configure (或者 ./configure --prefix=/usr/local)
make
make install
可执行文件通常都在 /usr/local/bin 下面,因为默认参数就是 --prefix=/usr/local
./configure --prefix=/usr (或者 ./configure --prefix=/opt 也可以指定其他位置,如你的家目录 --prefix=~,~就是 /home/xxx<即你的家目录>的缩写)
make
make install
可执行文件通常都在 /usr/bin 下面(或者相应地位于 /opt/bin 下面,或者 /home/xxx/bin 下面,xxx 是你的家目录)
无论那种方法,在 bash 控制台下只要输入可执行文件头几个字母,然后连续按两次 Tab 键,就可以列出可能的所有命令,如果只有一种可能,则自动显示该文件全名,这称为命令补全。想执行当前目录下的可执行文件,则必须使用 ./ 作为命令前导,例如: ./myprogram
除此之外,一般的可执行文件都处在系统的搜索路径里,只要在控制台直接输入命令名就可执行。例如你编译安装了一个叫 synaptic 的软件,只需要在 KDE 的 konsole 虚拟控制台下输入 synaptic 即可。 如果不幸,你的可执行文件不在系统的搜索路径里,就会报告没有这个命令。那么你需要把那个可执行文件的位置加入环境变量 PATH 里,用冒号作分割符,例如: 在你的家目录的 .profile 文件或 .bashrc 文件里添加如下命令 PATH="~/bin:$PATH" 就可以把你的家目录的 bin 目录追加到搜索路径里。无论任何时候想知道系统里某个“命令文件”的位置,都可以使用 which 命令,例如: $which pwd /usr/bin/pwd 说明 pwd 命令位于 /usr/bin 下面。
/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!/
/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!/
(程序安装于专用目录时,安装后的配置)(https://blog.csdn.net/bjzhaoxiao/article/details/81392474,) C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径。自己指定的路径就不说了,这里说明一下系统自动搜索的路径。
【1】include头文件路径
除了默认的/usr/include, /usr/local/include等include路径外,还可以通过设置环境变量来添加系统include的路径:
# C
export C_INCLUDE_PATH=XXXX:$C_INCLUDE_PATH
# CPP
export CPLUS_INCLUDE_PATH=XXX:$CPLUS_INCLUDE_PATH
#eg:export C_INCLUDE_PATH=/usr/local/boost/include
#eg:export CPLUS_INCLUDE_PATH=/usr/local/boost/include
以上修改可以直接命令行输入(一次性,下次重新开启终端,又得重新输入),可以在/etc/profile中在export PATH行前加入PATH=$PATH:/usr/local/apache/bin 这里以apache为例(对所有用户生效),记得是可执行文件所在的目录,路径中不要包含可执行文件。然后执行 :source /etc/profile #是我们的修改生效 。也可以在用户home目录下的.bashrc或.bash_profile中添加(针对某个用户生效),修改完后重新登录即生效。 使用软链接命令, ln -s /usr/local/apache/include /usr/include/apache)
【2】link链接库文件路径
链接库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的(也可以在编译命令中通过 -l -L 来指定,这里讲的是使用系统默认搜索路径)。一般 Linux 系统把 /lib /usr/lib /usr/local/lib 作为默认的库搜索路径,所以使用这几个目录中的链接库文件可直接被搜索到(不需要专门指定链接库路径)。对于默认搜索路径之外的库,则需要将其所在路径添加到gcc/g++的搜索路径之中。
链接库文件的搜索路径指定有两种方式:1)修改/etc/ld.so.conf 2)修改环境变量,在其中添加自己的路径:
动态链接库搜索路径:
export LD_LIBRARY_PATH=XXX:$LD_LIBRARY_PATH
静态链接库搜索路径:
export LIBRARY_PATH=XXX:$LIBRARY_PATH
以上修改可以直接export命令行输入(一次性),可以在/etc/profile中完成(对所有用户生效),也可以在用户home目录下的.bashrc或.bash_profile中添加(针对某个用户生效),修改完后重新登录即生效。
对应(1)在/etc/ld.so.conf 中添加指定的链接库搜索路径(需要root权限),将库文件的目录写一行记录在.conf文件中(
添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:/usr/X11R6/lib
/usr/local/lib
/opt/lib
),然后运行 /sbin/ldconfig命令(也有可能ldconfig命令)(ldconfig 命令要以 root 权限执行),以达到刷新 /etc/ld.so.cache的效果。以上两种方式均可以达到指定链接库搜索路径的效果。
在程序连接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过 -L 和 -l 参数显式指定。因为用 -L 设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。
gcc -I -L -l区别:我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数
例子1:gcc -o example1 example1.c -I /usr/local/include/freetype2 -lfreetype -lm
-I /usr/local/include/freetype2 表示将/usr/local/include/freetype2作为第一个寻找头文件的目录,参数-l (大写的i)。寻找的顺序是:/usr/local/include/freetype2-->/usr/include-->/usr/local/include
-lfreetype ,-l (小写的l)参数就是用来指定程序要链接的库,-l参数紧接着就是库名。指定程序链接的库名是freetype.
-lm 表示程序指定的链接库名是m (math数学库)
gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld
-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib,-lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件,加入参数 -static -lXXX,),程序链接的库名是world
gcc的使用简介与命令行参数说明:(三) 库操作选项
在Linux下开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。
从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(.so 或 .a)的集合。虽然Linux下的大多数函数都默认将头文件放到 /usr/include/ 目录下,而库文件则放到 /usr/lib/ 目录下,但并不是所有的情况都是这样。正因如此,gcc 在编译时必须有自己的办法来查找所需要的头文件和库文件。常用的方法有:
(1) -I
可以向 gcc 的头文件搜索路径中添加新的目录。
(2) -L
如果使用了不在标准位置的库文件,那么可以通过 -L 选项向 gcc 的库文件搜索路径中添加新的目录。
(3) -l
Linux下的库文件在命名时有一个约定,就是应该以 lib 这3个字母开头,由于所有的库文件都遵循了同样的规范,因此在用 -l 选项指定链接的库文件名时可以省去 lib 这3个字母。例如,gcc 在对 -lfoo 进行处理时,会自动去链接名为 libfoo.so 的文件。
(4) -static
Linux下的库文件分为两大类,分别是:动态链接库(通常以 .so 结尾)和静态链接库(通常以 .a 结尾)。
两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。
默认情况下,gcc 在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库。
如果需要的话,可以在编译时加上 -static 选项,强制使用静态链接库。
(5) -shared
生成一个共享的目标文件,它能够与其他的目标一起链接生成一个可执行的文件。
/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!/
/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!/
3、make install
编译成功后这一步来安装,后台做的就是把软件需要的文件拷贝到该放的位置,执行完这一步,这个源码包就算是安装成功了
做完以上三个步骤,一个源码包就算是已经安装成功了
4、安装后的配置
(1)把二进制程序目录导入至PATH环境变量中
可是还有一个问题,有的安装包呢,是包含着一些命令的,安装后才可以使用那些命令做某些特定的事情,而如果我们在安装时自己定义一个目录去安装源码包呢,这个被指定的文件就会是这个程序的根文件,那么这个包所包含的所有的文件就会保存在我们所指定的那个文件下,但是当输入一个二进制程序时,我们系统会默认在PATH变量的值中去寻找,PATH的值是一个或多个目录,当运行一个程序时,Linux会在这些目录下进行搜寻编译链接,而我们所安装的二进制程序的命令会在指定文件的/bin下,库文件保存在指定文件下的/lib文件中,man文件会在指定文件的/man下,所以我们在使用这个包的命令时是不能直接打出那个命令的,因为这个程序的二进制程序并没有保存至PATH变量中任何一个目录中,所以Linux会提醒找不到该命令。要想使用该命令得麻烦的去打这个二进制程序的全路径,例如:我把程序安装在/app/apache下,那么这个二进制程序会在/app/apache/bin/name,所以调用命令要/app/apache/bin/name –[选项] 这样用,感觉非常麻烦是不是?命令太长了,用起来不是太方便,我想不输入全路径就直接输入二进制程序名就可以运行该命令,这时候我们就就需要把二进制程序目录导入PATH环境变量中就OK了。
我们先来看一个PATH环境变量中都有哪些值
大家都看出了吧,PATH变量中有着很多值,每一个值都是一个目录,这些值之间以:分隔,这些目录都是Linux中包含着二进制程序的一些目录,我们执行一个二进制程序时Linux会在这各个值中寻找对应的二进制程序,找到就执行,找不到就会出错无法执行,下面我们就再给它添加我们所安装的源码包的二进制程序路径,就可以在下次运行程序时不用输入全路径,只输入程序名就可以了。
我们在这之前先来试验一下,我先安装好了一个httpd源码包,但是还没有把二进制程序目录导入PATH环境变量中来先运行一下看看会不会出错?输入全路径会不会出错?
结果证明了不把二进制程序目录导入至PATH环境变量中程序也可以用,只是用起来更麻烦一点要多输入路径,对于一些懒省事的小伙伴就会觉得用的不爽,下图就交大家怎么把二进制程序目录导入PATH环境变量中并且再运行一下该命令看看反应
但是这种方法的PATH在终端关闭后就会消失,所以建议通过编辑/etc/profile来改变PATH,也可以改家目录下的.bashrc
第二种方法:
#vim /etc/profile
在文档的最后,添加export PATH=”/app/apache/bin:$PATH” ,保存退出,然后运行
#source /etc/profile 注释:
不报错则成功
直接安装二进制
tar zxvf go1.8.3.linux-amd64.tar.gz
mv go /usr/local/
2、添加环境变量
vim /etc/profile
添加如下内容:
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
使配置生效:
[root@localhost ~]# source /etc/profile
[root@localhost ~]# go version
go version go1.8.3 linux/amd64
通过编译源码安装部署:
设置环境变量
root# vi /etc/profile
export GOPATH=/home/xxx/golang/project
export GOROOT=/home/xxx/golang/go
export PATH=$PATH:$GOROOT/bin
export GOROOT_BOOTSTRAP=/home/xxx/golang/go1.4
安装go1.8 需要新的环境变量GOROOT_BOOTSTRAP
而且此环境变量指向的目录实际上是go1.4的目录
root# source /etc/profile
(2)导入库文件路径
几个关系到能否成功编译的东西:/etc/ld.so.conf、ldconfig、PKG_CONFIG_PATH
说下/etc/ld.so.conf,这个文件记录了编译时使用的动态链接库的路径。 默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件 。如果你安装了某些库,比如在安装gtk+-2.4.13时它会需要glib-2.0 >= 2.4.0,辛苦的安装好glib后,没有指定 -prefix=/usr 这样glib库就装到了/usr/local下,而又没有在/etc/ld.so.conf中添加 /usr/local/lib 这个搜索路径,所以编译gtk+-2.4.13就会出错了。有两种方法解决: 一:在编译glib-2.4.x时,指定安装到/usr下,这样库文件就会放在/usr/lib中,gtk就不会找不到需要的库文件了。对于安装库文件来说,这是个好办法,这样也不用设置PKG_CONFIG_PATH了 (稍后说明) 。 二将/usr/local/lib加入到/etc/ld.so.conf中,这样安装gtk时就会去搜索/usr/local/lib,同样可以找到需要的库。将/usr/local/lib加入到/etc/ld.so.conf也是必须的,这样以后安装东东到local下,就不会出现这样的问题了。 将自己可能存放库文件的路径都加入到/etc/ld.so.conf中是明智的选择。添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:/
usr/X11R6/lib
/usr/local/lib
/opt/lib
ldconfig是个什么东东吧,它是一个程序,通常它位于/sbin下,是root用户使用的东东。具体作用及用法可以man ldconfig查到。
简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件缓存到 /etc/ld.so.cache 以供使用。因此当安装完一些库文件,例如刚安装好glib,或者修改ld.so.conf增加新的库路径后,需要运行一下/sbin/ldconfig 使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用的,结果编译过程中报错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂computer蠢猪一个。(环境变量LD_LIBRARY_PATH列出了查找共享库时除了默认路径之外的其他路径。如果不想修改或无法修改(无root权限)/etc/ld.so.conf而使用其他路径下的库文件 就需要设置LD_LIBRARY_PATH了 例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/lib 这样就可以使用/opt/lib下的库文件啦。)
再来说说 PKG_CONFIG_PATH这个变量吧,经常在论坛上看到有人问”为什么我已经安装了glib-2.4.x,但是编译gtk+-2.4.x 还是提示glib版本太低阿? 为什么我安装了glib-2.4.x,还是提示找不到阿?。。。。。。”都是这个变量搞的鬼。解决的办法很简单,设定正确的PKG_CONFIG_PATH,假如将glib-2.x.x装到了/usr/local/下,那么glib-2.0.pc就会在 /usr/local/lib/pkgconfig下,将这个路径添加到PKG_CONFIG_PATH下就可以啦。设定好后可以加入到~/.bashrc中,
例如:
PKG_CONFIG_PATH=/opt/kde-3.3.0/lib/pkgconfig:/usr/lib/pkgconfig:/usr/local/pkgconfig:
/usr/X11R6/lib/pkgconfig
[root@NEWLFS ~]#echo $PKG_CONFIG_PATH
/opt/kde-3.3.0/lib/pkgconfig:/usr/lib/pkgconfig:/usr/local/pkgconfig:/usr/X11R6/lib/pkgconfig
安装库文件时,从源码包管理上来说,都装在/usr下管理是个问题,不如装在/usr/local下方便管理 。其实只要设置好ld.so.conf,PKG_CONFIG_PATH路径后,就OK啦。 去google搜。或者找到感觉有价值的错误信息,拿到google去搜,往往会找到解决的办法。还是开始的那句话,要仔细看README,INSTALL 程序如何安装,需要什么依赖文件,等等。编译时,可以用&&连接命令, && 表示”当前一条命令正常结束,后面的命令才会执行”,就是”与”啦。 这个办法很好,即节省时间,又可防止出错。例:
./configure --prefix=/usr && make && make install
(3)导入头文件
基于链接的方式实现:
ln-sv
(4)导入帮助手册
/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!/
那些开源库你是怎么知道的:
根据需求。当你需要一个功能的时候,要么自己写,要么搜搜看别人有没有写过。不过不是当时就要做决定。你可以先写,之后在用别的替换,或者先用别人的库,不满足需求的话用自己的换掉。这都没问题。至于为什么要选那几个库,也是根据需求来。比如boost里面就有test,不一定要google test。所以这里得根据需要来测试两个库,从中挑一个。
2. 订阅相关领域的邮件/周刊。比如我比较关注 Python ,我就订了 Pycoder's Weekly, Python Weekly,每期都会介绍一些好的开源项目。中文的《码农周刊》不错
3. 关注相关领域的邮件列表/社区。一般来说好的项目都会有人讨论,作者也会第一时间到这些地方宣传自己的库。比如 reddit 之类的。
4. 关注代码托管网站(github, codeBucket)的趋势。比如 Github 上就有 explore 可以看到最近最热的项目。
5. 社交网络(twitter, facebook, 微博, Google+),关注一些大号。时不时会有些消息。
6. 关注相关领域每年的会议。比如PyCon啦,PyData,DroidCon之类的。一般来说每年这些社区都会开会,网上能找到视频。时不时的会介绍一些最新的牛掰项目。
7. 和朋友们交流。
8. 自行搜索。
9. 很多领域的大牛的博客/个人网站。一般不定期会有推荐。
没有必要关注什么大牛博客和论坛,善用搜索就足够了。
哦对了,我说的搜索是google,不保证baidu可以搜得到。
怎么找开源库:
既然是开源软件,那么必有源码托管,或者提供下载的地方。
具体是怎样,需要具体分析。
如:jdk,在安装的时候有提供源码安装选项。
如:spring框架,在官网下载时,会有spring-*.src.jar 的源码包。
如:某开源组件源码托管在 github 。类似代码托管有很多:sourceforge,github,码云,google code(已经关闭)…… 这需要你看软件的官网说明,或者类似 readme.txt 的介绍文件。
既然开源了,还用反编译那叫什么事。最好的方法就是到官方网站去了解。
怎么看开源库:
边看书边看源代码。边看源代码边自己写代码,调试代码,用这个库搭一个什么应用,然后一点点往上添东西,把自己学到的新东西写出来。
通用的代码阅读技巧:不管是开源库还是商业项目,还是公司项目,都是差不多。在阅读项目代码,就和每一个程序都有一个入口函数一样,每一个项目都是有入口点的。对于项目类的代码都是有文档的,在拿到代码时,1.阅读提纲性文档,从整体上对项目有全面的了解,知道项目能做什么,使用了什么技术,使用环境是什么。 对于复杂一点的项目,经常蕴含一些思想,比如低内聚高耦合,回调机制等。事先了解到这些基本思想后,在后续深入学习时,知道为什么要设计成这样,原因在于思想基调都这样,很多时候不是只有一种实现,就是为了统一风格。2.有了前面的整体的印象之后,需要具体去阅读代码,以求深入了解。然而对于复杂的代码,你可能还是无法下手。此时需要去阅读项目代码结构性设计的资料,如果官方有,看官方的,如果没有,可以看网上一些大神对代码的结构的分析。如果项目比较新或者比较冷门,网上没有什么资料,那么在没有资料的情况下(很多公司的项目都没有文档资料),这也很正常。此时如何阅读代码结构设计呢?靠自己!
这就是从整体上来阅读项目了。先不要细究与某块代码,将整个项目拿来分析,按照功能模块来分类,然后将模块之间的关系理清楚。然后将一些隐含的机制,如消息机制,都要理清出来。最后可以自己慢慢构建出一个完整的结构性设计文档。
这一步骤不要看具体的函数内的代码。在把握总体流程的层次看就行了。在一个读取配置的函数里,你只要知道这个函数是读取配置的就行了,具体如何读取,就暂时跳过。这样可以加速对整体框架的熟悉,避免细节干扰整体的设计认知。
另外,非常基础又重要的一点,就是,将主线找出来。即入口函数到运行的整个流程。不管是程序还是库,都会整体的运行流程的。可执行程序有入口主线程、库则会有加载、运行和卸载等。这个主线将各个模块串接在一起,形成一个完整的程序和库。
这一步能够把握到位,项目基本上很熟悉了。一般看能不能掌握项目,难就难在这一步。很多人根本不知道如何看项目,上来就陷入了各个局部的具体的代码实现里了,整了几个月还是对项目不清不楚的。这也是提纲挈领的重要性。真正掌握就是要整体上能够很熟悉。3.阅读具体模块说明资料
当需要进行局部功能新增和修改或者解决问题的时候,就需要深入到具体的模块里面了。这也是进一步深入学习项目的一步。我们要对模块的运行情况进行深入摸底。方法也是先整体把握模块的组成和流程。因为模块可以作为一个完整的实体,也可以再细分。所以也是应该从上到下的方式来解读。这样也可以高效的熟悉模块的情况。
如果能够对每一个模块做到了如指掌,那么这个项目已经了解了98%了。剩余的2%就是具体的代码实现了。
4.看具体的代码实现
最后一步才是看具体的代码实现。我们要对代码进行维护,就要看每一句代码,非常直观具体。然而大多数人都是直接从具体的每一行代码看项目。当然,假如你将项目每一句代码都熟悉了,自然项目也能够熟悉,但是效果还是不够好。一是记忆负担大,二是项目庞大之后,很容易被绕晕。三是效率极低,时间太长。
这一步在需要写代码时才会重点关注。当然,如果是学习,也是重点关注的。你可以学习人家代码的规范写法,人家代码的用法等等。
方法很重要,方法可以决定人与人之间的差距。合适的方法可以事半功倍。不管在做什么事情,时刻要有高效的概念,当你发现你的方法用了一段时间后,效果不满意,就要注意方法了。是否你的方法还不够好,是否需要改进。在踏实学习的基础上,选择更好的方法可以节省大量的时间.
刘帅:2019/9/19
头文件在include里,main(sample),网上