打算用packetdrill测点东西,从下载源码后,进行安装。
根据README,安装过程是很简单的,不过解压源码后先需要把configure设置为可执行权限, configure判断当前的系统类型然后建立Makefile的软连接指向
对应类型的Makefile.Linux/Makefile.FreeBSD等。
./configure && make
make出错了,提示/usr/bin/ld: cannot find -lpthread,
于是进行检查,发现pthread库已经安装,不过是在64位系统,所以在/etc/lib.so.conf指定了库路径,检查没有发现问题。
没想太多,跑到!forum/packetdrill的邮件列表看了一下,发现有人提到了相同问题。
一看答案,郁闷了半天,原来Makefile中gcc 指定了-static,自己也没仔细看。
于是安装静态库,yum install glibc-static,然后可以成功编译。
或者可以把-static的选项去掉,也是可以编译过的。
另外,简单说一下:
GCC链接库分静态库和动态库,静态库默认以libxxx.a的命名方式,而动态库以libxxx.so的命名方式。
链接静态库时单独复制一份库代码,运行时不加载库文件,而动态库运行时加载,使用该库文件的所有程序在内存中共享一份,不需要多次加载。
GCC链接-lxxx库时,默认会从/lib/和/usr/lib这两个地方去找链接库,若需要加入其他链接库有以下方式:
1)/etc/目录下有ld.so.conf、ld.so.cache和ld.so.conf.d/,其中ld.so.conf.d目录下又有多个*.conf的配置文件。
ld.so.conf内容为include /etc/ld.so.conf.d/*.conf,即包含ld.so.conf.d目录下所有配置文件,可以将私有链接目录加入已有配置文件,或新建私有配置文件。
另外,为了提高搜索效率,系统预先对所有配置文件生成了一个二进制的处理文件,即ld.so.cache,需要运行ldconfig手动更新这个文件。
2)LD_LIBRARY_PATH参数,利用export $LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/xxx增加自己的库路径,尽量不用。当指定库文件API与原有系统API冲突时优先使用LD_LIBRARY_PATH指定的库文件的API,其加载的时机早于系统其他库文件。
3)编译gcc参数时直接利用-L参数指明链接库路径
吃一堑,长一智,细心点总是没错的。。
阅读(2396) | 评论(0) | 转发(0) |