centos stream 10编译oceanbase出错

参照https://oceanbase.github.io/oceanbase/zh/build-and-run/

debug编译oceanbase

出现

[100%] Linking CXX executable oblogminer
[100%] Built target obtable_static

ld.lld: error: undefined symbol: pthread_mutexattr_setrobust_np
>>> referenced by proc_mutex.c
>>>               proc_mutex.o:(proc_mutex_pthread_create) in archive /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a
>>> did you mean: pthread_mutexattr_setrobust_np@GLIBC_2.4
>>> defined in: /lib64/libc.so.6

ld.lld: error: undefined symbol: pthread_mutex_consistent_np
>>> referenced by proc_mutex.c
>>>               proc_mutex.o:(proc_mutex_pthread_acquire) in archive /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a
>>> referenced by proc_mutex.c
>>>               proc_mutex.o:(proc_mutex_pthread_tryacquire) in archive /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a
>>> did you mean: pthread_mutex_consistent_np@GLIBC_2.4
>>> defined in: /lib64/libc.so.6

ld.lld: error: undefined symbol: sys_siglist
>>> referenced by signals.c
>>>               signals.o:(apr_signal_description_get) in archive /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a

ld.lld: error: undefined symbol: pthread_yield
>>> referenced by thread.c
>>>               thread.o:(apr_thread_yield) in archive /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a
ld.lld: error: undefined symbol: pthread_mutexattr_setrobust_np
>>> referenced by proc_mutex.c
>>>               proc_mutex.o:(proc_mutex_pthread_create) in archive /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a
>>> did you mean: pthread_mutexattr_setrobust_np@GLIBC_2.4
>>> defined in: /lib64/libc.so.6

ld.lld: error: undefined symbol: pthread_mutex_consistent_np
>>> referenced by proc_mutex.c
>>>               proc_mutex.o:(proc_mutex_pthread_acquire) in archive /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a
>>> referenced by proc_mutex.c
>>>               proc_mutex.o:(proc_mutex_pthread_tryacquire) in archive /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a
>>> did you mean: pthread_mutex_consistent_np@GLIBC_2.4
>>> defined in: /lib64/libc.so.6

ld.lld: error: undefined symbol: sys_siglist
>>> referenced by signals.c
>>>               signals.o:(apr_signal_description_get) in archive /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a

ld.lld: error: undefined symbol: pthread_yield
>>> referenced by thread.c
>>>               thread.o:(apr_thread_yield) in archive /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [src/logservice/logminer/CMakeFiles/oblogminer.dir/build.make:216: src/logservice/logminer/oblogminer] Error 1
make[1]: *** [CMakeFiles/Makefile2:12177: src/logservice/logminer/CMakeFiles/oblogminer.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [src/observer/CMakeFiles/observer_without_bolt.dir/build.make:197: src/observer/observer_without_bolt] Error 1
make[1]: *** [CMakeFiles/Makefile2:13032: src/observer/CMakeFiles/observer_without_bolt.dir/all] Error 2
[100%] Built target oceanbase
[100%] Built target obcdc
make: *** [Makefile:166: all] Error 2

操作系统为Linux 192.168.1.5 6.12.0-47.el10.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Jan 30 11:22:30 UTC 2025 x86_64 GNU/Linux

oceanbase分支为

commit d85cedcd9bbaef5163925b3c1d213d9fa6925ba4 (HEAD -> develop, origin/develop, origin/HEAD)
Author: yihong <zouzou0208@gmail.com>
Date:   Tue Jul 1 11:10:40 2025 +0800

    fix: should support centos aarch64 same as centos (#2293)
    
    Signed-off-by: yihong0618 <zouzou0208@gmail.com>
1 个赞

参考下面这个link:

我使用tarball在本机上下载安装了apr

root@192:/usr/local/apr/lib# ll libapr-1*
-rw-r--r--. 1 root root 1826958 Jul 11 20:24 libapr-1.a
-rwxr-xr-x. 1 root root     945 Jul 11 20:24 libapr-1.la
lrwxrwxrwx. 1 root root      17 Jul 11 20:24 libapr-1.so -> libapr-1.so.0.7.6
lrwxrwxrwx. 1 root root      17 Jul 11 20:24 libapr-1.so.0 -> libapr-1.so.0.7.6
-rwxr-xr-x. 1 root root  928192 Jul 11 20:24 libapr-1.so.0.7.6

然后将原来oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib目录下的删除,将我下载的拷贝过去,

root@192:/usr/local/apr/lib# cp -a libapr-1* /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib

meyok@192:~/Project/oceanbase$ ll deps/3rd/usr/local/oceanbase/deps/devel/lib | grep libapr-1
-rw-r--r--. 1 root  root    1826958 Jul 11 20:24 libapr-1.a
-rwxr-xr-x. 1 root  root        945 Jul 11 20:24 libapr-1.la
lrwxrwxrwx. 1 root  root         17 Jul 11 20:24 libapr-1.so -> libapr-1.so.0.7.6
lrwxrwxrwx. 1 root  root         17 Jul 11 20:24 libapr-1.so.0 -> libapr-1.so.0.7.6
-rwxr-xr-x. 1 root  root     928192 Jul 11 20:24 libapr-1.so.0.7.6

这样之后,执行./tools/deploy/obd.sh prepare -p /tmp/obtest得到

Installing /home/meyok/Project/oceanbase/build_debug/src/observer/observer FAIL
No such file: /home/meyok/Project/oceanbase/build_debug/src/observer/observer

或者重新执行bash build.sh debug --init --make得到

ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a(apr_snprintf.o)
>>> referenced by apr_snprintf.c:641 (strings/apr_snprintf.c:641)
>>>               apr_snprintf.o:(conv_p2_quad) in archive /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a

ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol; recompile with -fPIC
>>> defined in /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a(apr_snprintf.o)
>>> referenced by apr_snprintf.c:641 (strings/apr_snprintf.c:641)
>>>               apr_snprintf.o:(conv_p2_quad) in archive /home/meyok/Project/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a

...

这都不行哇

这个问题我已经上传至Stackoverflow。
https://stackoverflow.com/questions/79699905/oceanbase-build-error-relocation-r-x86-64-32-cannot-be-used-against-local-symbo

apr的包需要再centos stream 10上重新编译才可以

从你的报错来看这个libapr的库build的时候没加-fPIC,所以我理解你得重新build这个库,且带上-fPIC

1 个赞

噢,我找到错误原因了:我把-fPIC参数添加到生成目标文件的指令上,而不是生成库的。这个参数可以通过./configure配置,所以可以这样做:

su -
# create the installation directory
mkdir /usr/local/apr

# get the tarball
cd /usr/local/src
wget https://github.com/apache/apr/archive/refs/tags/1.7.0.tar.gz
tar -zcvf 1.7.0.tar.gz

# install
cd 1.7.0.tar.gz
./buildconf
./configure --prefix=/usr/local/apr CFLAGS="-fPIC" CXXFLAGS="-fPIC"
make && make install

# replace
cp /usr/local/apr/lib/libapr-1* oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib

不好意思^_^。谢谢你们的帮助。