linux程序怎样静态链接glibc相关的库,程序发布不依赖glibc版本?
在不同OS版本发布程序的时候,如果glibc库不一样就会出现下面的错误:
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./a.out)
这就是因为glibc库不一致导致的。
我们可以通过下面命令看可执行文件依赖的glibc库版本:
# 查看依赖的库
objdump -x xxx.so | grep NEEDED
# 查看可执行程序依赖的库
objdump -x ./testTime | grep NEEDED
那回到头,如何静态编译呢,下面是一个cmakefile的例子:
# CMake 最低版本号要求
cmake_minimum_required (VERSION 3.5)
# 项目信息
project (evp-Demo)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
set(EXECUTABLE_OUTPUT_PATH ${
PROJECT_BINARY_DIR}/bin)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
# set(CMAKE_BUILD_TYPE "Debug")
# set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -fpermissive -pthread")
# set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -fpermissive")
# set(root_path /workspace/depends)
# if(NOT CMAKE_TOOLCHAIN_FILE)
# set(CMAKE_TOOLCHAIN_FILE "aarch64.cmake")
# include(${
CMAKE_TOOLCHAIN_FILE})
# set(root_path /root/workspace/depends)# endif()
# message("-- Using toolchain: ${CMAKE_TOOLCHAIN_FILE}")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLGAS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLGAS}")
set(CMAKE_EXE_LINKER_FLAGS "-static")
# set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
set(SOURCES main.cpp evp.cpp config.cpp csc_coeff.cpp)
# 指定生成目标
add_executable(CSC ${
SOURCES})
这样后,就不会又glibc依赖的问题了。
如果直接手动编译的话:
gcc -static libjpeg.cpp /usr/lib/x86_64-linux-gnu/libjpeg.a -o libjpeg.exe
参考:https://www.zhihu.com/question/22940048
【gcc】高版本gcc编译出的程序在低版本glibc机器上运行
如果发现不兼容,可以通过下面的命令来看支持的最新版本:
strings /usr/lib/x86_64-linux-gnu/libc.so.6 |grep GLIBC
可以发现两个版本支持的最高版本是不一样的,可以通过低版本编译来包含更低版本
查看某个库的: