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

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. python爬取并批量下载图片

    import requests from lxml import etree url='http://desk.zol.com.cn/meinv/' add1='.html' urls=[] i = ...

  2. Flask----目录结构

    以此结构为例,这个小项目是<Flask Web开发:基于python的web应用开发实战>第一部分结束后的代码框架 第一层 有app.tests.migrations三个文件夹和confi ...

  3. I - The 3n + 1 problem(2.4.2)

    I - The 3n + 1 problem(2.4.2) Crawling in process... Crawling failed Time Limit:1000MS     Memory Li ...

  4. ROS基础

    在ROS中启动Gazebo物理仿真环境 roslaunch gazebo_ros empty_world.launch 打开后一片漆黑是以为gazebo需要从国外的网站上下载模型,国内网络不行,一直下 ...

  5. tensorflow模型在实际上线进行预测的时候,使用CPU工作

    最近已经训练好了一版基于DeepLearning的文本分类模型,TextCNN原理.在实际的预测中,如果默认模型会优先选择GPU那么每一次实例调用,都会加载GPU信息,这会造成很大的性能降低. 那么, ...

  6. webpack.DefinePlugin

    通过配置了DefinePlugin,那么这里面的标识就相当于全局变量,你的业务代码可以直接使用配置的标识.比如,你通过下面的设置: // webpack.config.js new webpack.D ...

  7. shell 文件描述符

    /tmp/test.sh > /tmp/test.log 2>&1 这个命令的意思是 前半部分是将shell的输出重定向到/tmp/test/log.默认是标准输出(stdout文 ...

  8. kvm qemu ,ubuntu debian rootfs 通过qemu复现路由器漏洞

    KVM https://www.toutiao.com/i6264303973256135170/?tt_from=weixin&utm_campaign=client_share&t ...

  9. SQL[Err]ORA-00XXX: missing 相关

    1.[Err]ORA-00936: missing expression 造成这个错误的原因是:选取的最后一个字段与from之间有逗号 解决方法:将字段与from之间的逗号去掉. 2.[Err] OR ...

  10. notify,wait,synchronized实现线程间通知

    wait阻塞线程释放锁:notify使wait所在的线程被唤醒在次获得锁,并执行,但要等到notify所在的线程代码全部执行后! 示例代码如下: package com.vhbi.service.im ...