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給覆蓋了。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM