gcc Oracle Linux 8上的GLIBC版本错误

lmvvr0a8  于 2023-08-06  发布在  Oracle
关注(0)|答案(1)|浏览(204)

我需要重建修补版本的rocksaw图书馆。这里是source code on Github
在Ubuntu 22上,构建过程和测试程序都按预期运行。问题发生在Oracle Linux 8上,我在同一台机器上成功构建后得到以下错误:

[root@localhost lib]# ldd librocksaw.so
./librocksaw.so: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by ./librocksaw.so)
        linux-vdso.so.1 (0x00007ffd686b5000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f4522793000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f4522b58000)

字符串
Glib的安装版本是2.28

[root@localhost lib]# ldd --version
ldd (GNU libc) 2.28


这里是Makefile

UNAME  := $(shell uname)
CYGWIN := $(findstring CYGWIN,$(UNAME))
DARWIN := $(findstring Darwin,$(UNAME))

CC       = gcc
SHARED   = -shared
CFLAGS   = -Wall -O2 -pipe -D_REENTRANT
WINSOCK  = ws2_32
EXTRA_LDFLAGS  =
EXTRA_CPPFLAGS =
LDFLAGS  = $(EXTRA_LDFLAGS)
CPPFLAGS = $(EXTRA_CPPFLAGS)
LIBNAME  = librocksaw
LIBEXTENSION = so

ifeq ($(DARWIN),Darwin)
  JAVA_INCDIR  = $(JAVA_HOME)/include
  LIBEXTENSION = jnilib
  CPPFLAGS += -I$(JAVA_INCDIR)
  LDFLAGS += -dynamiclib -noprebind -single_module -framework JavaVM
  SHARED =
else
  ifeq ($(CYGWIN),CYGWIN)
    override CC += -mno-cygwin
    CPPFLAGS += -D__int64="long long"
    LDFLAGS += -Wl,--kill-at -l$(WINSOCK)
    JDK_HOME := $(shell cygpath $(JDK_HOME))
    LIBNAME      = rocksaw
    LIBEXTENSION = dll
  endif

  JAVA_INCDIR      = $(JDK_HOME)/include
  JAVA_INCDIR_PLAF = $(dir $(wildcard $(JAVA_INCDIR)/*/jni_md.h))
  CPPFLAGS += -I$(JAVA_INCDIR) -I$(JAVA_INCDIR_PLAF)
  CFLAGS += -ansi -pthread -fPIC -DPIC
endif

SRC := $(shell find . -name "*.cpp" -print)
OBJ := $(SRC:%.cpp=%.o)

CLEAN_EXTENSIONS = o $(LIBEXTENSION)

LIBROCKSAW = $(LIBNAME).$(LIBEXTENSION)

all: $(LIBROCKSAW)

%.o: %.cpp
    $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@

$(LIBROCKSAW): $(OBJ)
    $(CC) $(SHARED) -o $@ $^ $(LDFLAGS)

clean:
    for extension in $(CLEAN_EXTENSIONS); do \
        find . -name "*.$$extension" | xargs rm -f ; \
    done
    find . -name "*~" | xargs rm -f


我不明白在构建过程中谁和何时链接了另一个版本的Glib。也许它以某种方式与Java有关,因为这个库包括Java和本机构建工件,不是吗?
有什么想法吗

inkz8wg9

inkz8wg91#

问题发生在Oracle Linux 8上,我在同一台机器上成功构建后得到以下错误:
很可能你没有在同一台Oracle Linux 8机器上构建这个librocksaw.so--可能你从另一台机器上复制了对象,并且没有执行make clean来真正地重建库。
要查看链接时实际使用的libc.so.6,可以将-Wl,-t添加到链接行并重新链接librocksaw.so。如果这表明您使用的是libc.so.6系统,那么librocksaw.so * 将正常工作 *。
如果您在其他地方有libc.so.6的另一个副本,请删除该副本-它首先不应该在Oracle Linux机器上。
我不明白在构建过程中谁和何时链接了另一个版本的Glib。
glib和GLIBC是完全独立的项目,前者与您的问题无关。

相关问题