justwinit.cn
注 册 商: 北京新网数码信息技术有限公司HTTP/1.1 200 OK 服务器:nginx 访问时间:2015年05月28日 14:27:22 类型:text/html; charset=utf-8 Transfer-Encoding: chunked 连接:keep-alive 语言环境:PHP/5.6.3 修改日期:2015年05月28日 04:41:59 ExpiresThu, 28 May 2015 08: 41:59 +0000 缓存控制:max-age=43200 Content-Encoding: gzip 动作:Accept-Encoding 网站编码:utf-8
向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除|赢在IT,Playin' with IT,Focus on Killer Application,Marketing Meets Technology.首页Write边栏分页: 1/222 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [ 显示模式: 摘要 | 列表 ][置顶] [实践Ok]memcache的静态编译lib库在makefile里的引用及h头文件动态指向(编译时用到),对Linux下的Makefile在实践中得以重新认识的记录备案~静态编译问题之warning: Using 'getaddrinfo' in statically linked ...WEB2.0 » Unix&Linux技术 justwinit 2015-4-23 16:39引用地址: 注意: 该地址仅在今日23:59:59之前有效背景:其实之前没有研究过c的静态编译,包括对Linux下的make依赖啥的也不太懂,于是试着用c的头文件组织文件相互调用同时,觉得把生成的项目做成一个静态链接版本可执行文件,以便于在各种啥都不装的linux平台上运行(One file ,run as server ok的个人理想主义思想。),有点像像山寨嵌入式开发。我想简单,链接参数加一个-static不就行了,但接下来解决一系列问题的时间远远超出我的意料linux 静态链接 mysql glibc 库的悲催过程,边学习边扯淡,边记录,最后还是硬给扯到最后一步了给glibc的dlopen给挡住了,我看网上也有兄弟遇到类似的,但都最后妥协成动态编译这个glibc,加上参数:-ldl,我是学习实践,所以就不用了,但记录一下总是好事情。一)关于Makefile的三个特点:multipepollserver:multipepollserver.o memcachedclient.o writeFile.o memorypool.o readconf.o multipepollserver.h readconf.h memorypool.h readconf.h memcachedclient.h /usr/bin/gcc44 -Wall -O0 -g -o multipepollserver multipepollserver.o memorypool.o readconf.o writeFile.o -lrt -lpthread -lmemcached (1)把上面这个后面的.h去了也能编译过,那这些.h在Makefile里是不是没有用? 回答:.h用于符号链接 ,如果不包进去在运行的时候,或动态库加载时会产生符号表找不到。去掉是没问题,我也没加头文件。加上头文件依赖,修改头文件后,也会引起重新编译。(2)memcachedClientGet找不到,在代码里都包含了,但是make时说找不到。 你也要依赖memcachedclient.o呀,你的实现在这里面,你不加进去,当然找不到。(这儿是核心:就是上面第二行,说找不到:也就是说第二行才是真正编译时的参数,第一行,主要是以来之用,没有第一行的.o,那么,后面写的这些.oMakefile规则是不会去编译的,所以也得写上涉及到的.o。)是的,如下,居然说找不到这个函数:vi multipepollserver.h #include "memcachedclient.h" 这个我有包含的呀,vim memcachedclient.c#include "memcachedclient.h" ls memcachedclient.hmemcachedclient.hcat memcachedclient.c|grep memcachedClientGetint memcachedClientGet(char *getKey,char *value){二)关于静态编译:问:如何把memcached由动态编译变为静态编译:答:把 -lmemcached 改成 /.../libmemcached.a它不是.a,是.la,要.a的,.la为libtool自动生成的一些共享库,可以用vi编辑查看,主要记录了一些配置信息。它为何不在:/usr/local/libmemcached/下面,而是在,为何不放一块儿?出现:undefined reference to `sasl_done'版本对不对??估计这些接口是在新版本中新定义的,你链接的可能是旧版本。我对memcached没研究,不清楚。静态库版本估计看不出,除非它源代码里有版本信息的字符串,可以抓一抓。你可以执行strings libmemcached.a | grep 找不到的接口名称看有没有打印,没打印什么内容,那就说明该静态库里面没这个接口。兄弟所说的也就是.h的定义和这个.a不匹配是吧:1)libmemcached/memcached.h (/usr/local/libmemcached/)2)/usr/local/lib/libmemcached.a你这个静态库在编译的时候是不是没有开启sasl支持?导致编译出来的是没带sasl。[root@test libmemcached-1.0.18]# ./configure --prefix=/usr/local/libmemcached --enable-sasl[root@test libmemcached-1.0.18]# make clean & make & make install ./libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory //根据经验,又是gcc的版本不够了。export CC=/usr/bin/gcc44export CXX=/usr/bin/g++44一定要确认是否加成功了,如下:[root@test libmemcached-1.0.18]# echo $CC/usr/bin/gcc44[root@test libmemcached-1.0.18]# echo $CXX/usr/bin/g++44于是编译通过了, 编译再次顺利通过,来自:https://justwinit.cn/post/7693/问题还有:/usr/local/libmemcached/lib/libmemcached.a(libmemcached_libmemcached_la-delete.o):(.data.DW.ref.__gxx_personality_v0[DW.ref.__gxx_personality_v0]+0x0): undefined reference to `__gxx_p
© 2010 - 2020 网站综合信息查询 同IP网站查询 相关类似网站查询 网站备案查询网站地图 最新查询 最近更新 优秀网站 热门网站 全部网站 同IP查询 备案查询
2024-05-04 22:45, Process in 0.0028 second.