Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1753485
  • 博文数量: 199
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 6186
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-30 11:01
个人简介

Linuxer.

文章存档

2015年(4)

2014年(28)

2013年(167)

分类: LINUX

2013-03-15 16:47:09

发生在安装php前端解析rphp的部署,在安装完成程序gmp  cmake  icu  boost后,开始安装llvm-2.7. 经过llvm安装后,再编译我们的程序,出现libgmpxx.so undefined reference to M_init_....,不通过。


类似的问题出现在测试环境部署过程,当编译完成该前端解析器后,由于其依赖一些库文件,包括系统库文件libstdc++.so.6及libc.so,这都是系统至关重要的库文件。但是不同系统之前此两个库的版本一般都是不同的,若直接将编译后的可执行程序及相关的库文件放到部署机器上,将很可能出现大问题,这里有个血的教训,直接将所有库文件覆盖到另一台机器,包括libstdc++.so.6及libc.so,直接导致系统被破坏,无法使用。


以上两个问题,有个共性,就是都和系统库文件相关。其中libgmpxx.so undefined reference to M_init_.... libgmpxx.so直接依赖库libstdc++.so.6;而后一种情况很明显是系统提供的库文件与我们需要的库文件版本不一致导致,其实前者也是由于系统中同时存在两个不同版本的ibstdc++.so.6。发现在安装llvm时,放置了一个ibstdc++.so.6到/usr/local/lib下,与原先系统的/usr/lib下的冲突了。


对于以上两种关于系统库的问题,该怎么处理呢?

第一种情况比较简单,统一下两个库就可以,即将/usr/local/lib下的libstdc++.so.6libstdc++.so.6.0.*删除,拷贝/usr/lib下的libstdc++.so.6.0.*/usr/local/lib,并重新建立软链接libstdc++.so.6到新的libstdc++.so.6.0.*而对于后一种,有两个办法:一是直接在目标机器上编译安装;而另一种则是以静态库方式编译,生成一个可执行程序,不依赖其他库,具体就不详细说明了。


附:

gmp :   ./configure --enable-cxx; make; make check; sudo make install

icu:  ./runConfigureICU Linux; make; make check; sudo make install

cmake: ./bootstrap; make; sudo make install

bootst: ./bootstrap.sh; ./bjam; sudo ./bjam install

llvm: mkdir build; cd build; ../configure; make; sudo make install

阅读(5555) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~