. 花了幾天時間,需要把經驗給記下來。
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給覆蓋了。