保姆级高通AEC9调试指南(看完可解决80%AE相关问题)

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机器上运行

第三方so通过patchelf兼容低版本glibc

如果发现不兼容,可以通过下面的命令来看支持的最新版本:
strings /usr/lib/x86_64-linux-gnu/libc.so.6 |grep GLIBC

在这里插入图片描述
在这里插入图片描述
可以发现两个版本支持的最高版本是不一样的,可以通过低版本编译来包含更低版本
查看某个库的:在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/VinagerJoe/article/details/126848224