1. 程式人生 > >在Centos上執行不同版本C++執行庫的解決辦法

在Centos上執行不同版本C++執行庫的解決辦法

來由:生產環境的Centos6.4,gcc 4.4.7,不支援C++11,如果全部升級gcc費勁,嘗試以下辦法解決

1.在centos6.4虛擬機器上編譯gcc5.3.0,安裝在/usr/local/gcc-5.3.0目錄下

2.寫CMakeList檔案,修改rpath目錄為執行目錄,具體內容是

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
project(test)

SET(CMAKE_C_COMPILER /usr/local/gcc-5.3.0/bin/gcc)
SET(CMAKE_CXX_COMPILER /usr/local/gcc-5.3.0/bin/g++)

INCLUDE_DIRECTORIES(/usr/local/gcc-5.3.0/include/c++/5.3.0/  ./)
LINK_DIRECTORIES(/usr/local/gcc-5.3.0/lib64/)
#以下為修改rpath
SET(CMAKE_SKIP_RPATH FALSE) 
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath,'$ORIGIN'" )

MESSAGE("build test")

IF (NOT CMAKE_BUILD_TYPE)
    SET(CMAKE_BUILD_TYPE Debug)
ENDIF(NOT CMAKE_BUILD_TYPE)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -std=gnu99 -pedantic -s  -Wunused-function")#-Wno-long-long
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Os -ffunction-sections -fdata-sections")#-O2 -Os 

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -s -std=c++11 -fpermissive")#-Wno-long-long
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}  -g")
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os -ffunction-sections -fdata-sections")#-O2 -Os 
SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -Wl,--gc-sections")

MESSAGE("makefile in build mode: ${CMAKE_C_FLAGS}")

ADD_EXECUTABLE(
	test
	test.cpp
)

TARGET_LINK_LIBRARIES(
	test
	dl
	pthread
)
3.編寫測試程式
#include <stdlib.h>
#include <stdio.h>
#include <thread>
int main(void)
{
	std::thread t([]()
	{
		printf("hello,world!\n");
	});
	t.join();
	return 0;
}
4.執行命令

cmake ./src/ -DCMAKE_BUILD_TYPE=Debug && make

5.檢視rpath

readelf -d ./test 

Dynamic section at offset 0x4980 contains 26 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [$ORIGIN:/usr/local/gcc-5.3.0/lib64]
 0x000000000000000c (INIT)               0x401b68
 0x000000000000000d (FINI)               0x4033a8
 0x0000000000000004 (HASH)               0x400240
 0x0000000000000005 (STRTAB)             0x400c88
 0x0000000000000006 (SYMTAB)             0x4004a8
 0x000000000000000a (STRSZ)              3027 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x604b78
 0x0000000000000002 (PLTRELSZ)           360 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x401a00
 0x0000000000000007 (RELA)               0x4019b8
 0x0000000000000008 (RELASZ)             72 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x401908
 0x000000006fffffff (VERNEEDNUM)         4
 0x000000006ffffff0 (VERSYM)             0x40185c
 0x0000000000000000 (NULL)               0x0

6.檢視依賴的執行庫

[[email protected]*****] ldd ./test
	linux-vdso.so.1 =>  (0x00007fff3c92b000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003753800000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003753c00000)
	libstdc++.so.6 => /usr/local/gcc-5.3.0/lib64/libstdc++.so.6 (0x00007fa8c6207000)
	libm.so.6 => /lib64/libm.so.6 (0x0000003754800000)
	libgcc_s.so.1 => /usr/local/gcc-5.3.0/lib64/libgcc_s.so.1 (0x00007fa8c5ff0000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003753400000)        
	/lib64/ld-linux-x86-64.so.2 (0x0000003753000000)

看出依賴兩個庫:libstdc++.so.6 libgcc_s.so.1

7.拷貝依賴庫和程式到生產機器上目錄test內,在上一級目錄執行驗證

./test/test

02:07 [[email protected]*****]$ ./test/test 
hello,world!
tty:[1] jobs:[0] cwd:[/opt/xx]


相關推薦

Centos執行不同版本C++執行解決辦法

來由:生產環境的Centos6.4,gcc 4.4.7,不支援C++11,如果全部升級gcc費勁,嘗試以下辦法解決 1.在centos6.4虛擬機器上編譯gcc5.3.0,安裝在/usr/local/gcc-5.3.0目錄下 2.寫CMakeList檔案,修改rpath目錄

CentOS編譯myget時報SSL錯誤的解決辦法

      今天在centos上編譯myget,報下面的錯誤: make  all-recursive make[1]: Entering directory `/root/soft/myget-0.1.2' Making all in src

CentOS Mono 3.2.8執行ASP.NET MVC4經驗

週一到週三,折騰了兩天半的時間,經歷幾次周折,在小蝶驚鴻的鼎力幫助下,終於在Mono 3.2.8上執行成功MVC4。在此總結經驗如下: 系統平臺的版本: CentOS 6.5 Mono 3.2.8 Jexus 5.5.1  VS2012 英文Ultimate版 由於採用的是英文版本,因此下面圖片也都是英

Java 自定義 ClassLoader 實現隔離執行不同版本jar包的方式

1. 應用場景 有時候我們需要在一個 Project 中執行多個不同版本的 jar 包,以應對不同叢集的版本或其它的問題。如果這個時候選擇在同一個專案中實現這樣的功能,那麼通常只能選擇更低版本的 jar 包,因為它們通常是向下相容的,但是這樣也往往會失去新版本

CentOSoracle 11g R2數據安裝折騰記

現在 unknown product 密碼登錄 緩沖 libstdc 字節 虛擬機 命令 1.虛擬機上centos鏡像的獲取。這裏推薦網易鏡像站中的CentOS7版本(其他開源鏡像站亦可)。這裏給出鏈接: http://mirrors.163.com/centos/7.3.

C#使用List出現“集合已修改;可能無法執行枚舉操作”錯誤的解決辦法

枚舉 array 操作 each 使用 list 行修改 例如 解決 原因: 在循環的時候,當集合被刪除了一個item後,那麽總數 count和索引就會發生改變.所以會報錯 解決方法: 不要在List上執行枚舉集合的操作(例如foreach)中去執行修改集合的操作。如果需

關於SQL不同版本數據不同操作系統安裝的說明

簡單 pos 空間 clas 如果 應用 div 應用軟件 mage 關於SQL不同版本數據庫在不同操作系統安裝的說明SQL2000數據庫,文件小,安裝設置也比較方便,應用軟件使用SQL2000數據庫,運行速度比較快,也比較穩定。SQL2000數據庫在XP、WIN7(32位

centos下安裝不同版本的python

PE val lob bin 依賴包 TE sql 完成 環境變量 1. 安裝環境以及依賴包   可以直接yum安裝:      yum -y install git gcc make patch zlib-devel gdbm-devel openssl-devel s

圖解十分鐘在centos安裝各個版本mysql(5.6,5.7,5.8)

授之以魚不如授之以漁,一下是安裝各個版本mysql的步驟,雖然比直接給步驟麻煩點,但是以後安裝一個可用的本地mysql應該夠用了。我只測試過(5.7,我看了下5.6文件,官網安裝命令不一樣,其他步驟差不多) 前提條件:因為系統原因把,先檢查 1:先檢查是否安裝了32位的libnuma 

有兩個不同版本的jQuery,衝突的解決辦法

這是1.5.1版本 和1.10.2版本的jQuery: <script src="js/jquery-1.5.1.min.js"></script> <script type="text/javascript"> var $15

Xcode 10.1 執行版本工程遇到問題解決記錄

近來接手公司一個歷史遺留專案進行修改、上線工作,想想我都近三年沒敲過iOS程式碼了也是慌。。   專案大致情況: 18年年初應上線專案,各種情況下一直擱置,到18年底了要重啟上線,原來開發人員離職了都,年底開發人員工作也都各種忙的。。  於是,PM角色被拉來兜底0.0 閒扯一段,以下

關於winserver2012執行c++程式缺少dll的原因,而且c++執行時程式安裝失敗的解決辦法

windows server 2012 發現有報錯缺少dll的現象原因: 缺少更新包 解決辦法及步驟 第一步,安裝更新包Windows8.1-KB2919442-x64.m

在Linux的使用開源C++日誌 ---log4cplus

1.簡 介     log4cplus是C++編寫的開源的日誌系統,前身是java編寫的log4j系統.受Apache Software License保護。作者是Tad E. Smith。     log4cplus具有執行緒安全、靈活、以及多粒度控制的特點,通過將資訊劃分優先順序使其可以面向程式除錯、

阿里雲執行./byfn.sh -m up失敗解決辦法

在fabric-samples/first-network#目錄下,修改如下幾個檔案: docker-compose-cli.yaml: 在cli -> environment下面新增: - GODEBUG=netdns=go base/docker-compo

Linux不能執行netstat命令的原因及解決辦法

伺服器是阿里雲的,這是我出的錯,使用netstate命令報 -bash: netstate: command not found 出現這個錯誤的原因:由於網路工具沒有安裝 使用以下命令安裝即可: yum install net-tools 執行命令: netstat -

Ubuntu更新源執行update命令仍失敗的解決辦法!!

解決步驟: 1.用編輯器開啟resolv.conf vi /etc/resolv.conf 改為如下內容: search localdomain nameserver 8.8.8.8 //希望修改成的DNS nameserver 8.8.6.6 //備用的DNS  

android 相容不同版本懸浮框許可權解決

1,4.4以下使用TYPE_SYSTEM_ALERT,需要許可權android.permission.SYSTEM_ALERT_WINDOW; 2,4.4到7.0,使用TYPE_TOAST,不需要額外許可權;(既然TYPE_TOAST不需要

SpringBoot執行時dataSource建立失敗的解決辦法

先貼錯誤資訊: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class p

【程式碼重構 & JDT】Windows命令列執行Java檔案陷入死迴圈解決辦法

通過修改某個Java檔案的AST節點生成n個新程式,然後用測試用例分別對這n個新程式進行執行。但是在執行過程中,發現有些新生成的新程式會陷入死迴圈的情況,後臺的java.exe一直在執行。解決方法是:設定每個程式最長執行時間為10秒,超時後,再使用命令列的形式殺掉後臺的java.exe程序。程式

CentOS某一使用者宕機後處理辦法

Linux 宕機有很多種情況,最常見的是系統負載過高。系統負載過高導致的卡死,一解決的越快越好! 必須要養成不依賴任何圖形介面的東西,通常使用windows的人都有這習慣,這隻會繼續加重這種卡死的局面。 解決辦法:使用linux的文字介面tty。按 Ctrl-Alt-