1.Linux下源码安装的护源护源经验详解
2.让你的Golang项目在IDE里跑起来(Goland使用入门-GOROOT、GOPATH、码保src、代码 pkg、护源护源bin、码保import)
3.pkg是代码自适应网页源码什么意思
4.理解 pkg-config 工具
5.如何安装pkg-config
Linux下源码安装的经验详解
在linux下安装软件,难免会碰到需要源码安装的护源护源,而就是码保这简简单单的./configure、make、代码sudo make install三步,护源护源却让不少人头疼不已,码保这里以安装X为例具体介绍下我在安装时的代码一点小经验,以便共同学习,护源护源共同进步!码保
首先,代码我们要做些准备工作,源码安装少不了这几个工具pkg-config、libtool、autoconf和automake(当然,还有更基础的,像zlib、m4等,这里就略过啦),其中,pkg-config是相对比较重要的,它就是向configure程序提供系统信息的程序,如软件的版本、库的版本以及库的路径等信息,这些只是在编译期间使用。你可以打开/usr/lib/pkgconfig下任意一个.pc文件,就会发现类似下面的信息(X的pc文件):
prefix=/usr
exec_prefix=${ prefix}
libdir=${ exec_prefix}/lib
includedir=${ prefix}/include
xthreadlib=-lpthread
Name: X
Description: X Library
Version: 1.3.3
Requires: xproto kbproto
Requires.private: xcb = 1.1.
Cflags: -I${ includedir}
Libs: -L${ libdir} -lX
Libs.private: -lpthread
configure就是靠着这些信息来判断软件版本是否符合要求的。接着来看看pkg-config是怎样工作的,缺省情况下,pkg-config首先在usr/lib/pkgconfig/中查找相关包(譬如x)对应的相应的文件(x.pc),若没有找到,它也会到PKG_CONFIG_PATH这个环境变量所指定的路径下去找,若是还没有找到,它就会报错。所以这里就可以得到一些解决configure时提示**库未找到的办法了,先用命令ldconfig -p | grep 库名来分析该库是否安装及其路径,若返回空,则说明该库确实未安装,否则,可以根据该命令的返回结果找到库的安装地点,然后设置其环境变量,命令如下:
export PKG_CONFIG_PATH=软件位置/lib/pkgconfig:$PKG_CONFIG_PATH,这里有个常识,软件安装后,.pc文件都是在安装目录下的lib/pkgconf中的。这样只会在当前命令窗口有效,当然,你也可以修改home文件夹下的.bashrc文件(带.的文件为隐藏文件,可以用命令vi .bashrc编辑),电脑源码导入方法在文件末尾加上上面那句命令,重新登录即可。其他的几个在linux下也是不可或缺的,libtool为管理library时使用,没装的话错误提示如下:possibly undefined macro:AC_PROG_LIBTOOL。而autoconf和automake可以用于在某些没有configure的文件的源码包安装时使用(pixman就是个典型的例子,安装了二者后直接./autogen.sh就可以安装了)。
准备工作做好后,就可以安装了,具体全部命令如下:
tar vxf libX-6.2.1.tar.gz
cd libX-6.2.1
mkdir X-build
cd X-build
../configure prefix=/usr/local/XR6
make
echo $
sudo make install
这里有一些好的安装习惯可以积累一下:1、建立一个临时编译目录,本例中为X-build,这样可以再安装完成后删除该目录,进而可以节省空间,而且保持了源码目录的整洁;2、安装到指定目录,本例中为/usr/local/XR6,最好把几个相关的安装在同一文件夹下,如这里的XR6文件夹,这样便于管理,否则全部默认安装在/usr/local下,很杂乱;3、编译完成后做检查,本例为echo $,表示检查上一条命令的退出状态,程序正常退出返回0,错误退出返回非0,也可以使用make check,主要为了防止make失败后直接install,进而出现了一些莫名其妙的错误。这里还介绍一种更方便快捷的安装方法,用将安装命令连接起来,如../configure prefix=**makesudo make install,这样,只有在前面的命令执行正确的情况下,后面的任务才会执行,多方便!
除此之外,安装之前可以阅读下源码包中的readme和install等文档,往往有所需软件及其下载地址,还包括一些安装技巧和配置选项。另外,在configure前,先输入configure help,可以查看有哪些选项可以添加。还有几个关系安装成功的东西就是ldconfig了,在安装时如果提示找不到某个库或者在编译时提示找不到**.so文件,就要用到它了,最简单的解决办法就是sudo gedit /etc/ld.so.conf,在文件中加入**.so文件所在路径,再运行一下ldconfig就可以了,但是朔源码安全吗我对这个东西有阴影,不知道是因为用了虚拟机还是其他的原因,有7、8次我在运行完ldconfig后,Ubuntu就没办法打开任何窗口了,直接关机重启就更是进不去系统了,崩溃之,不知道有没有高手有解决办法。在这里提供一种代替ldconfig的办法,就是export LD_LIBRARY_PATH=*.so文件地址:$LD_LIBRARY_PATH,用它我就舒心多了,也就是麻烦点,哥忍了,总比系统崩溃强多了吧,呵呵!其实,在configure时碰到问题,你应该庆幸,因为你可以根据它很明显的提示找到缺失的东西装上,在配置下pkgconfig和ldconfig基本上就可以搞定了,但是make的时候就没那么简单了。
编译时提示最多的就是**东西未找到了,要么是库文件,要么是头文件,库文件用上面的ldconfig基本上就可以搞定,头文件的话需要配置包含的路径,和库的类似,命令如下:
export LD_INCLUDE_PATH=/usr/local/include:$LD_INCLUDE_PATH
在这个时候最重要的就是淡定了,循着丫的error往上找,像No such file or directory这样的错误提示肯定就在附近,找到了,include之就可以咯!
让你的Golang项目在IDE里跑起来(Goland使用入门-GOROOT、GOPATH、src、 pkg、bin、import)
启动你的Golang项目,避免反复配置的困扰,理解并掌握GOROOT、GOPATH、src、pkg和bin这几个关键目录至关重要。首先,一个基本的项目结构包括src目录存放源代码,bin存放编译后的可执行文件,而pkg则存放编译后的包文件。bin和pkg通常由go命令自动生成,你只需创建src来存放项目代码。
创建一个简单的项目,例如命名为main,包含main.go文件。内容如下:
创建好项目后,奶粉溯源码不全接下来就是在Goland中配置。你需要设置GOROOT,指向你的Go安装路径,这类似Java的JAVA_HOME。同时,配置GOPATH,指定你的项目源代码的根目录。
Goland中,有两种GOPATH配置:Project GOPATH针对每个项目独立,Global GOPATH则适用于共享第三方包。在ToolBar的配置中,选择运行文件时,指定main.go所在的文件夹,输出文件夹为src的同级bin目录,工作目录即设置的GOPATH。
注意,如果在多个项目中频繁切换,不要修改配置框中的目录,否则可能导致运行错误。例如,你可以这样配置:
点击保存并运行,成功后你会看到bin目录自动创建。若需自定义输出文件名,可使用-o参数。
在项目中引用其他模块或第三方包时,只需将相关代码放入src的子目录中,如添加一个calc文件夹下的add.go。注意,包名和文件夹名一致,函数名不因文件名改变而改变。
对于第三方包的引用,如common库,只需在main中导入并调用即可。更多关于vendor工具的使用,可以关注我的后续更新。
以上内容参考了《小议并实战go包------顺便说说go中的GOROOT,GOPATH和src,pkg,bin》一文,由OpenWrite博客发布。
pkg是什么意思
pkg的意思pkg是一个在计算机编程和软件开发中常见的词汇,它代表“package”。在计算机领域,特别是在软件开发和程序管理中,"package"这个词通常用来描述一个包含软件代码和相关文件的集合。这些文件可能包括源代码、库文件、配置文件等,它们被打包成一个或多个文件或文件夹,以便于分发、安装和管理。这样做的主要目的是简化软件的部署和更新过程。接下来对pkg进行详细解释。
首先,在计算机编程和软件领域,经典django源码下载"package"是一个包含多个文件或模块的集合。这些文件或模块通常具有特定的功能或实现特定的任务。它们可以被打包成一个独立的实体,以便于分发和共享。打包的主要好处是减少了复杂性,使得软件更容易安装和管理。对于开发人员而言,这是一种有效的组织和管理代码的方式。而对于普通用户来说,软件包提供了安装应用程序所需的便利性和简洁性。同时,"pkg"也常用于操作系统和软件分发平台中,作为软件分发和管理的单位。此外,"pkg"相关的工具和命令广泛应用于各种编程语言和软件开发环境中,帮助开发者管理和分发软件包。通过了解和掌握"pkg",人们可以更有效地管理和开发软件项目,提高软件开发的效率和便捷性。简而言之,"pkg"为软件开发人员提供了一个有效组织代码的方式,促进了软件的分发、安装和管理过程。
理解 pkg-config 工具
你在 Unix 或 Linux 下开发过软件吗?写完一个程序,编译运行完全正常,在你本机上工作得好好的,你放到源代码管理系统中。然后,告诉你的同事说,你可以取下来用了。这时,你长长的出了一口气,几天的工作没有白费,多么清新的空气啊,你开始飘飘然了。“Hi,怎么编译不过去?”你还沉浸在那种美妙的感觉之中,双臂充满着力量,似乎没有什么问题能难倒你的。正在此时,那个笨蛋已经冲着你嚷开了。
“不会吧,我这边好好的!”表面上你说得很客气,其实,你心里已经骂开了,真笨,不知道脑子干嘛用的。也许,你想的没错,上次,他犯了一个简单的错误,不是你一去就解决了吗。
他喊三次之后,你不得不放下你手上的工作,刚才那种美妙的感觉已经消失得无影无踪了,要不是你把情绪控制得很好,一肚子气就要撒在他身上了。你走到他的电脑前,键入 make,优雅的按下回车。怎么可能出错呢?你信心十足。然而,屏幕上的结果多少有点让人脸红,该死的,libxxx.so 怎么会让不到呢?
你在/usr目录中查找 libxxx.so,一切都逃不过你的眼睛。奇怪,libxxx.so 怎么在 /usr/local/lib 下,不是应该在 /usr/lib 下的吗?这你可不能怪别人,别人想安装在哪里都行,下次还可能安装到 /lib 目录下呢。
以上的场景并非虚构,我都经历过好几次,明明在本机上好好的,在别人的机器上连编译都过不去。可能两人的操作系统一模一样,需要的库都安装上,只是由于个人 喜好不同,安装在不同的目录而已。遇到这种情况,每次都技巧性的绕过去了,用的补丁型的方法,心里老惦记其它地方能不能工作。
今天我们要介绍的 pkg-config,为解决以上问题提供了一个优美方案。从此,你再也不为此担忧了。pkg-config提供了下面几个功能:
检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
获得编译预处理参数,如宏定义,头文件的位置。
获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
自动加入所依赖的其它库的设置。
这一切都自动的,库文件安装在哪里都没关系!
在使用前,我们说说 pkg-config 的原理,pkg-config 并非精灵,可以凭空得到以上信息。事实上,为了让pkg-config可以得到这些信息,要求库的提供者,提供一个.pc文件。比如gtk+-2.0的pc文件内容如下:
复制代码
代码如下:
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
includedir=/usr/include
target=x/ppgtk_binary_version=2.4.0
gtk_host=i-redhat-linux-gnu/ppName: GTK+
Description: GIMP Tool Kit (${ target} target)
Version: 2.6.7
Requires: gdk-${ target}-2.0 atk
Libs: -L${ libdir} -lgtk-${ target}-2.0
Cflags: -I${ includedir}/gtk-2.0
这个文件一般放在 /usr/lib/pkgconfig/ 或者 /usr/local/lib/pkgconfig/ 里,当然也可以放在其它任何地方,如像 X 相关的pc文件是放在 /usr/XR6/lib/pkgconfig 下的。为了让pkgconfig可以找到你的pc文件,你要把pc文件所在的路径,设置在环境变量 PKG_CONFIG_PATH 里。
使用 pkg-config 的 –cflags 参数可以给出在编译时所需要的选项,而 –libs 参数可以给出连接时的选项。例如,假设一个 sample.c 的程序用到了 Glib 库,就可以这样编译:
复制代码
代码如下:
$ gcc -c `pkg-config –cflags glib-2.0` sample.c
然后这样连接:
复制代码
代码如下:
$ gcc sample.o -o sample `pkg-config –libs glib-2.0`
或者上面两步也可以合并为以下一步:
复制代码
代码如下:
$ gcc sample.c -o sample `pkg-config –cflags –libs glib-2.0`
可以看到:由于使用了 pkg-config 工具来获得库的选项,所以不论库安装在什么目录下,都可以使用相同的编译和连接命令,带来了编译和连接界面的统一。
使用 pkg-config 工具提取库的编译和连接参数有两个基本的前提:
库本身在安装的时候必须提供一个相应的 .pc 文件(不这样做的库说明不支持 pkg-config 工具的使用)。
pkg-config 必须知道要到哪里去寻找此 .pc 文件。
GTK+ 及其依赖库支持使用 pkg-config 工具,所以剩下的问题就是如何告诉 pkg-config 到哪里去寻找库对应的 .pc 文件,这也是通过设置搜索路径来解决的。
对于支持 pkg-config 工具的 GTK+ 及其依赖库来说,库的头文件的搜索路径的设置变成了对 .pc 文件搜索路径的设置。.pc 文件的搜索路径是通过环境变量 PKG_CONFIG_PATH 来设置的,pkg-config 将按照设置路径的先后顺序进行搜索,直到找到指定的 .pc 文件为止。
安装完 Glib 后,在 bash 中应该进行如下设置:
复制代码
代码如下:
$ export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATH
可以执行下面的命令检查是否 /opt/gtk/lib/pkgconfig 路径已经设置在 PKG_CONFIG_PATH 环境变量中:
复制代码
代码如下:
$ echo $PKG_CONFIG_PATH
这样设置之后,使用 glib 库的其它程序或库在编译的时候 pkg-config 就知道首先要到 /opt/gtk/lib/pkgconfig 这个目录中去寻找 glib-2.0.pc 了(GTK+ 和其它的依赖库的 .pc 文件也将拷贝到这里,也会首先到这里搜索它们对应的 .pc 文件)。之后,通过 pkg-config 就可以把其中库的编译和连接参数提取出来供程序在编译和连接时使用。
另外还需要注意的是:环境变量的设置只对当前的终端窗口有效。如果到了没有进行上述设置的终端窗口中,pkg-config 将找不到新安装的 glib-2.0.pc 文件、从而可能使后面进行的安装(如 glib 之后的 Atk 的安装)无法进行。
在我们采用的安装方案中,由于是使用环境变量对 GTK+ 及其依赖库进行的设置,所以当系统重新启动、或者新开一个终端窗口之后,如果想使用新安装的 GTK+ 库,需要如上面那样重新设置 PKG_CONFIG_PATH 和 LD_LIBRARY_PATH 环境变量。
这种使用 GTK+ 的方法,在使用之前多了一个对库进行设置的过程。虽然显得稍微繁琐了一些,但却是一种最安全的使用 GTK+ 库的方式,不会对系统上已经存在的使用了 GTK+ 库的程序(比如 GNOME 桌面)带来任何冲击。
为了使库的设置变得简单一些,可以把下面的这两句设置保存到一个文件中(比如 set_gtk-2. 文件):
复制代码
代码如下:
export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
之后,就可以用下面的方法进行库的设置了(其中的 source 命令也可以用 . 代替):
复制代码
代码如下:
$ source set_gtk-2.
只有在用新版的 GTK+ 库开发应用程序、或者运行使用了新版 GTK+ 库的程序的时候,才有必要进行上述设置。
如果想避免使用 GTK+ 库之前上述设置的麻烦,可以把上面两个环境变量的设置在系统的配置文件中(如 /etc/profile)或者自己的用户配置文件中(如 ~/.bash_profile) ;库的搜索路径也可以设置在 /etc/ld.so.conf 文件中,等等。这种设置在系统启动时会生效,从而会导致使用 GTK+ 的程序使用新版的 GTK+ 运行库,这有可能会带来一些问题。当然,如果你发现用新版的 GTK+ 代替旧版没有什么问题的话,使用这种设置方式是比较方便的。
库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用:
在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。
在 /etc/ld.so.conf 文件中添加库的搜索路径。
将自己可能存放库文件的路径都加入到 /etc/ld.so.conf 中是明智的选择。( ^_^)
添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:
复制代码
代码如下:
/usr/XR6/lib
/usr/local/lib
/opt/lib
需要注意的是:第二种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是 因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ld.so.cache 从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf 中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/ld.so.cache 文件之后才可以。ldconfig ,简单的说,它的作用就是将 /etc/ld.so.conf 列出的路径下的库文件缓存到/etc/ld.so.cache以供使用。因此当安装完一些库文件(例如刚安装好 glib 或者修改 ld.so.conf 增加新的库路径)后,需要运行一下 /sbin/ldconfig 使所有的库文件都被缓存到 ld.so.cache 中,如果没做,即使库文件明明就在 /usr/lib 下的,也是不会被使用的,结果编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂 computer 蠢猪一个。 (^_^)
在程序连接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过 -L 参数显式指定。因为用 -L 设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。
前面已经说明过了,库搜索路径的设置有两种方式:在环境变量 LD_LIBRARY_PATH 中设置以及在 /etc/ld.so.conf 文件中设置。其中,第二种设置方式需要 root 权限,以改变 /etc/ld.so.conf 文件并执行 /sbin/ldconfig 命令。而且,当系统重新启动后,所有的基于 GTK2 的程序在运行时都将使用新安装的 GTK+ 库。不幸的是,由于 GTK+ 版本的改变,这有时会给应用程序带来兼容性的问题,造成某些程序运行不正常。为了避免出现上面的这些情况,在 GTK+ 及其依赖库的安装过程中对于库的搜索路径的设置将采用第一种方式进行。这种设置方式不需要 root 权限,设置也简单:
复制代码
代码如下:
$ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
可以用下面的命令查看 LD_LIBRAY_PATH 的设置内容:
复制代码
代码如下:
$ echo $LD_LIBRARY_PATH
最后,我来总结一下,PKG_CONFIG_PATH 主要指明.pc文件的所在路径,这样 pkg-config 工具就可以根据.pc文件的内容动态生成编译和连接选项,比如 Cflags (编译用)和 Libs (连接用),如果使用的是动态链接库,那么程序在连接和运行时,一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,对于处于默认库搜索路径之外的库,系统管理员可以设置 LD_LIBRARY_PATH 环境变量或在 /etc/ld.so.conf 文件中添加库的搜索路径。值得说明的是,使用 gcc 连接时的选项,如果不用 pkg-config 工具,需要显示的声明连接的动态链接库名。使用 gcc 的同学可以查看下面的注意事项。
Linux 系统中,为了让动态链接库能被系统中其它程序共享,其名字应符合 lib*.so.* 这种格式。如果某个动态链接库不符合此格式,则 Linux 的动态链接库自动装入程序(ld)将搜索不到此链接库,其它程序也无法共享之。格式中,第一个*通常表示为简写的库名,第二个*通常表示为该库的版本号。如在我的系统中,基本C动态链接库的名字为 libc.so.6,线程 pthread 动态链接库的名字为 libpthread.so.0 等等。如果没有指定版本号,比如 libmy.so ,这也是符合要求的格式。
gcc 命令几个重要选项:
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号,不用该标志外部程序无法连接。相当于一个可执行文件)。
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-L.:表示要连接的库在当前目录中。
-lmy:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称(libmy.so)。
当然如果有 root 权限的话,可以修改 /etc/ld.so.conf 文件,然后调用 /sbin/ldconfig 来达到同样的目的,不过如果没有 root 权限,那么只能采用输出 LD_LIBRARY_PATH 的方法了。
如何安装pkg-config
安装源码包软件的关键在于理解和遵循README和INSTALL等指导文件,这些文件会指导你顺利安装。通常的步骤如下:
首先,使用命令tar jxvf .tar.bz2解压源码包,例如gtk+-2.4..tar.bz2。接着,通过cd进入解压后的目录,如gtk+-2.4./。
在某些情况下,你可能会遇到./configure导致终端退出的问题,这时可以尝试使用.configure conf来继续。configure程序会自动检测你的系统信息,生成Makefile,以便后续的make命令。如果./configure失败并出现“make: *** No targets specified and no makefile found. Stop.”,表明Makefile未创建,这时应先尝试make。
当./configure成功后,就进入了正式的编译阶段,通过make进行编译。编译完成后,通常使用make install进行安装,这将把软件安装到默认的目录,如/usr/local。不过,部分软件也支持make uninstall卸载,具体操作可能会在README中有所提及,但这种情况相对较少。
configure命令带有很多可选项,通过./configure –help可以查看详细参数。常规参数通常在前面,而程序特有的参数则在后面。例如,如果你想要指定安装目录,可以使用–prefix=/path/to/install。
总之,安装源码包软件需要细致的阅读文档,并按照指示进行,确保每个步骤都正确执行。