我需要重建修补版本的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和本机构建工件,不是吗?
有什么想法吗
1条答案
按热度按时间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是完全独立的项目,前者与您的问题无关。