前言
《深圳男子图鉴》搬砖ing,但是还是不要忘了学习啊。
Linux安装软件一直是一个难以形容的东西,记得刚进小组的Linux知识技能大赛就是安装一个软件(ntfs-3g?)。那么对于Linux下除了方便的包管理系统rpm yum apt-get 等等等等,可以让我们轻松愉快的安装软件之外,还有一种很重要的安装方式,就是源码编译安装。
对于C/C++这种 一次编写,反复调,啊不是,一次编写,到处编译运行的代码,用源码编译来安装几乎是最完美的方式了(ABI问题等等)。
最近在耗时好久完成一次源码编译安装+链接开发之后,又收获了很多知识,赶紧总结一下。
正文
需要安装的软件是ProtoBuffer,因为开发环境很麻烦,所以直接上传源码包安装。
照例我们需要执行
./configure
make
make install
Ok,那么问题来了。
我们需要编译出的可执行程序protoc,还有他的so库libprotobuf。
但是目前呢,按照这个流程会将protoc放在/usr/bin libprotobuf放在/usr/lib
但是如果我不想让他这样子呢(才不会说是没权限呢)
我只希望能把这些东西生成在我自己的目录下。
不得不说google的开源项目还是挺良心的,在INSTALL.txt下有这样的说明
By default,
make install
will install the package’s files in
/usr/local/bin
,/usr/local/man
, etc. You can specify an
installation prefix other than/usr/local
by giving ‘configure’ the
option--prefix=PATH
.
enmm之前一直觉得configure只是检测一下系统的配置依赖啥的,才知道还可以控制之后的Makefile,对整个编译过程都有影响。
同时,我们知道对于这种库,需要在gcc的参数里制定链接路径-L
和头文件路径-I
.
想起了C链接MySQL时用到的MySQL的C客户端了,当时有个东西叫mysql_config
,安装MySQL的C客户端自带的好像,再需要链接MySQL的库时直接加上`mysql_config - -libs`就行了,不用自己再手动去找路径了。
而今天发现了有类似功能的东西–pkg-config
像pb在源码编译安装时就会产生一个protobuf.pc的文件。存在于/usr/bin/pkgconfig下,它里面的内容如下
prefix=/home/kang
exec_prefix=\${prefix}
libdir=\${exec_prefix}/lib
includedir=${prefix}/include
Name: Protocol Buffers
Description: Google's Data Interchange Format
Version: 2.6.1
Libs: -L\${libdir} -lprotobuf -pthread -lpthread
Libs.private: -lz
Cflags: -I${includedir} -pthread
# Commented out because it crashes pkg-config *sigh*:
# http://bugs.freedesktop.org/show_bug.cgi?id=13265
# Conflicts: protobuf-lite
so 如果我们想开发需要pb的程序,就不用再手动-L
啥的了,直接编译时加上`pkg-config --libs(后面也要有那个点,md太蛋疼了,我不知道咋加)
瞄了一眼,似乎源码编译安装的库都会可以通过pkg-config
来操作呢,真是很方便。
最近还学到一个知识点是gcc的-D参数可以传递宏,控制条件编译,比如设置的很多断言啊,就可控制略掉了。