linux升级gclibc版本,在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

#include

#include

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.查看依赖的运行库

[root@*****] 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 [root@*****]$ ./test/test

hello,world!

tty:[1] jobs:[0] cwd:[/opt/xx]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值