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

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给覆盖了。

C++编译变更stlport到使用g++的stl经验总结的更多相关文章

  1. ubuntu14 编译安装(升级)g++

    编译安装(升级)g++ ubuntu14自带的g++为4.8.4,不支持c++11.现要将g++升至5.2.0 1.下载安装: 参考https://www.cppfans.org/1719.html ...

  2. VS2013 编译&使用 stlport

    1. 下载stlport.   下载地址:http://sourceforge.net/projects/stlport/ 2. 解压到一个目录下面, 我的是解压到D:\project_kuku\pr ...

  3. Makefile 编译时虽然加上了-g 选项 但是还是无法调试

    make 编译时默认的命令是all,不能写成其他的

  4. [转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)

    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库 ...

  5. g++编译流程

    测试程序test.cpp如下所示: #include <iostream> using namespace std; #define MAX 9 int main() { //just f ...

  6. linux下使用g++编译cpp工程

    C++编程中相关文件后缀 1.单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: /* helloworld.cpp */ #includ ...

  7. g++编译总结

    g++编译&&gdb调试&&coredump调试 一.编译注意细节 1.使用g++编译CPP文件如果用gcc编译C++源文件时,加以下选项:-lstdc++,否则使用了 ...

  8. Linux-编译器gcc/g++编译步骤

    gcc和g++现在是gnu中最主要和最流行的c&c++编译器.g++是c++的命令,以.cpp为主:对于c语言后缀名一般为.c,这时候命令换做gcc即可.编译器是根据gcc还是g++来确定是按 ...

  9. gcc与g++的编译链接的示例详解

    一.编译方式的示例详解 1. 编译C代码 代码如下:main.c /*!  ************************************************************** ...

随机推荐

  1. Android开发实战(申明:来源于网络)

    Android开发实战(申明:来源于网络) 地址:http://so.csdn.net/so/search/s.do?q=Android%E5%BC%80%E5%8F%91%E5%AE%9E%E6%8 ...

  2. 洛谷P1433 吃奶酪【dfs】【剪枝】

    题目:https://www.luogu.org/problemnew/show/P1433 题意: 给定n个坐标,要求从(0,0)开始走遍所有点,最少经过的路程. 思路: 刚开始想像数字三角形一样适 ...

  3. win10 Java环境变量,hadoop 环境变量

    妈呀,今天又重装了系统.需要装上java环境. 安装环境老百度,然后老掉坑.(path 路经) 1,新建环境变量 JAVA_HOME 2, 新建 CLASSPATH 环境变量 .;%JAVA_HOME ...

  4. MySQL获取分组后的TOP 1和TOP N记录-转

    有时会碰到一些需求,查询分组后的最大值,最小值所在的整行记录或者分组后的top n行的记录,在一些别的数据库可能有窗口函数可以方面的查出来,但是MySQL没有这些函数,没有直接的方法可以查出来,可通过 ...

  5. angular 表单元素的使用总结

    工作中form表单元素最常用的是input,问题没有太多,现在总结下select ,radio组,checkbox的使用 1 select 常用的使用方式,如下 var Cityis = [{id:0 ...

  6. SSH 结构中 不同角色登录,显示不同的菜单

    关于这个功能,这里也就是提供一个思路,在做项目的时候因为要用到,肯定存在更好的方法,此思路仅供参考. 一.关于前台页面的接收方式 这里使用struts2的标签: <s:iterator valu ...

  7. 广播消费:允许一个 Group ID 所标识的所有 Consumer 都会各自消费某条消息一次。

    什么是消息队列 RocketMQ?_消息队列 RocketMQ-阿里云 https://help.aliyun.com/document_detail/29532.html 2019-01-30 16 ...

  8. [daily][grub2] grub2修改内核选项

    以前, 我们就直接去修改 /boot/grub/grub.cfg 文件了. 其实这并不正确. 正确的做法是: 1.  修改 /etc/default/grub 文件. [root@dpdk ~]# c ...

  9. python之if __name__ == '__main__'

    if __name__ == '__main__' 我们简单的理解就是: 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行.

  10. mysql拼接sql的语法concat()用法

    之前写了oracle拼接sql是用“||”,那么mysql也有自己的拼接的语法concat() concat()的基本语法是如下: 括号内的拼接内容语法和python中拼接显示字符串和变量.常量时一样 ...