C++编译变更stlport到使用g++的stl经验总结

. 花了几天时间,需要把经验给记下来。

1. 需要支持C++11的编译器,最方便的方式就是

yum -y install devtoolset-6

在/usr/local/bin中增加gcc6.sh

#!/bin/bash

scl enable devtoolset-6 bash

如果把这个放到~/.bashrc中,可能登录时会造成系统资源不足,我试试放在~/.bash_profile中。

CMakeLists.txt中增加:

macro(use_cxx11)
if (CMAKE_VERSION VERSION_LESS "3.1")
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set (CMAKE_CXX_FLAGS "-std=gnu++11 ${CMAKE_CXX_FLAGS}")
endif ()
else ()
set (CMAKE_CXX_STANDARD 11)
endif ()
endmacro(use_cxx11)

use_cxx11()

 


原来stlport里用的是hash_map,需要更改为g++ stl中的unordered_map,全局替换就行了。

2. 依赖的第三方库原来使用stlport编译出来的。比如,把libcppunit.a拷贝到tmp/t下,

ar x libcppunit.a

会发现有一个libstlport.a这个库。放弃这个libcppunit.a,
yum -y install cppunit

如果下载源码:是https://sourceforge.net/projects/cppunit/files/cppunit/1.12.1 中的地址。

CMakeLists.txt中,libcppunit.a 改为libcppunit.so, 并且把原来的.a从原来位置挪开。

还发现
#define RESULT2ERR {ostringstream os;os << result;lastError = os.str();}
这个报编译错误,是result是XmlRpcValue类型,是libXmlRpc中的。

下载源码:https://gigenet.dl.sourceforge.net/project/xmlrpcpp/xmlrpc%2B%2B/Version%200.7/xmlrpc%2B%2B0.7.zip,然后编译,解决编译错误,主要是有些文件没有包含 string.h。生成的是.a,决定用.so,修改makefile。

CPPFLAGS增加:-fPIC
CPPFLAGS = -I$(SRC) -fPIC

增加目标:

$(SO): $(OBJ)
$(CXX) -shared -o $@ $(OBJ)

测试文件Validator.cpp对编译错误做修改:

// s += params[0][params[0].size()-1]; //tj com, cannot compile
s += std::string(params[0][params[0].size()-1]);

把编译出来的.so拷贝到/usr/local/lib下,把src/*.h拷贝到/usr/local/include/xmlprc。在CMakeLists.txt中做相应的修改,老的.a挪走。

3. 对libXmlRpc.a做测试时,需要

MY_LIBS   :=  $(MY_LIBS)  -Wl,-Bstatic -L/usr/local/lib -lXmlRpc -Wl,-Bdynamic  -lm 

注意-lm这样写,否则会报错。

CMakeLists需要增加:

LINK_DIRECTORIES(/usr/local/lib)

整个问题,从google上搜索找不到有效的答案。主要是需要顿悟: cppunit是用了stlport才编译出来的,而我们不想使用stlport。突然领悟了这个,问题才最终得到解决。

4. 中间担心cmake有问题,下载cmake3.10.x版本,并且安装。安装时指定 
./configure --bindir=/usr/local/cmake ,争取不要把缺省的cmake2.8给覆盖了。


 

转载于:https://www.cnblogs.com/tangxiaosheng/p/7718286.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值