Ubuntu aarch64编译PHP OCI8扩展遇libclntsh.so不兼容错误
问题解决:编译PHP OCI8扩展时出现libclntsh.so不兼容错误
平台/PHP版本
- Ubuntu 22.04
- Linux内核版本:5.15.0-1013-oracle #17-Ubuntu SMP Fri Jun 24 10:14:16 UTC 2022(aarch64架构)
- PHP 8.1.2 (cli) (NTS版本,编译于2022年6月13日)
参考文档
- Oracle自治数据库专用版官方文档
- Oracle Instant Client Linux下载官方文档
问题现象
编译PHP的OCI8扩展过程中,链接器输出如下错误:
/usr/bin/ld: skipping incompatible /opt/oracle/instantclient_21_7/libclntsh.so when searching for -lclntsh /bin/bash /tmp/pear/temp/pear-build-rootJI40hE/oci8-3.2.1/libtool --mode=link cc -shared -I/tmp/pear/temp/pear-build-rootJI40hE/oci8-3.2.1/include -I/tmp/pear/temp/pear-build-rootJI40hE/oci8-3.2.1/main -I/tmp/pear/temp/oci8 -I/usr/include/php/20210902 -I/usr/include/php/20210902/main -I/usr/include/php/20210902/TSRM -I/usr/include/php/20210902/Zend -I/usr/include/php/20210902/ext -I/usr/include/php/20210902/ext/date/lib -I/opt/oracle/instantclient_21_7/sdk/include -DHAVE_CONFIG_H -g -O2 -o oci8.la -export-dynamic -avoid-version -prefer-pic -module -rpath /tmp/pear/temp/pear-build-rootJI40hE/oci8-3.2.1/modules oci8.lo oci8_lob.lo oci8_statement.lo oci8_collection.lo oci8_interface.lo oci8_failover.lo -Wl,-rpath,/opt/oracle/instantclient_21_7 -L/opt/oracle/instantclient_21_7 -lclntsh libtool: link: cc -shared -fPIC -DPIC .libs/oci8.o .libs/oci8_lob.o .libs/oci8_statement.o .libs/oci8_collection.o .libs/oci8_interface.o .libs/oci8_failover.o -L/opt/oracle/instantclient_21_7 -lclntsh -g -O2 -Wl,-rpath -Wl,/opt/oracle/instantclient_21_7 -Wl,-soname -Wl,oci8.so -o .libs/oci8.so /usr/bin/ld: skipping incompatible /opt/oracle/instantclient_21_7/libclntsh.so when searching for -lclntsh /usr/bin/ld: cannot find -lclntsh: No such file or directory /usr/bin/ld: skipping incompatible /opt/oracle/instantclient_21_7/libclntsh.so when searching for -lclntsh collect2: error: ld returned 1 exit status make: *** [Makefile:224: oci8.la] Error 1 ERROR: make failed
链接器提示跳过不兼容的libclntsh.so库文件,最终因无法找到匹配的库导致编译失败。
问题原因
服务器为aarch64(ARM64)架构,但当前安装的Oracle Instant Client是x86-64(AMD64)版本,两者架构不匹配,链接器无法识别并使用该库文件。
解决方案
卸载现有x86-64版本的Instant Client
删除对应目录及文件:sudo rm -rf /opt/oracle/instantclient_21_7下载对应aarch64架构的Oracle Instant Client
选择与系统架构匹配的Instant Client包(包含基础包、SDK包),版本需与OCI8扩展兼容(如21.7版本的aarch64包)。安装并配置aarch64版本的Instant Client
- 解压下载的压缩包到指定目录:
sudo unzip instantclient-basic-linux.aarch64-21.7.0.0.0dbru.zip -d /opt/oracle/ sudo unzip instantclient-sdk-linux.aarch64-21.7.0.0.0dbru.zip -d /opt/oracle/ - 创建软链接简化路径:
sudo ln -s /opt/oracle/instantclient_21_7 /opt/oracle/instantclient - 配置库路径环境变量:
编辑/etc/profile.d/oracle.sh文件:
添加以下内容:sudo nano /etc/profile.d/oracle.sh
使环境变量生效:export LD_LIBRARY_PATH=/opt/oracle/instantclient:$LD_LIBRARY_PATH export ORACLE_HOME=/opt/oracle/instantclientsource /etc/profile.d/oracle.sh
- 解压下载的压缩包到指定目录:
重新编译OCI8扩展
重新执行安装命令,编译时指定正确的Instant Client路径:pecl install oci8若提示输入路径,输入
/opt/oracle/instantclient即可。
内容的提问来源于stack exchange,提问作者Ahmad Asjad
相关产品推荐
相关产品推荐

