Linux 报错 undefined reference to xxx@openssl_1.0.0
背景
程序迁移(本地 -> 服务器),make之后出现错误“undefined reference to xxx@openssl_1.0.0”
错误代码
wc@r740:~/EDCR/EDCR_C$ make
Scanning dependencies of target edcr_exec
make[2]: Warning: File 'EstimatingDeltaCompressionRatio.cpp' has modification time 25582 s in the future
[ 33%] Building CXX object CMakeFiles/edcr_exec.dir/EstimatingDeltaCompressionRatio.cpp.o
[ 66%] Building CXX object CMakeFiles/edcr_exec.dir/xdelta/xdelta3.cpp.o
[100%] Linking CXX executable edcr_exec
/home/wc/EDCR/EDCR_C/./dDelta/libddelta.so: undefined reference to `SHA1_Final@OPENSSL_1.0.0'
/home/wc/EDCR/EDCR_C/./dDelta/libddelta.so: undefined reference to `SHA256_Final@OPENSSL_1.0.0'
/home/wc/EDCR/EDCR_C/./dDelta/libddelta.so: undefined reference to `MD5_Final@OPENSSL_1.0.0'
/home/wc/EDCR/EDCR_C/./dDelta/libddelta.so: undefined reference to `SHA1_Init@OPENSSL_1.0.0'
/home/wc/EDCR/EDCR_C/./dDelta/libddelta.so: undefined reference to `SHA1_Update@OPENSSL_1.0.0'
/home/wc/EDCR/EDCR_C/./dDelta/libddelta.so: undefined reference to `MD5_Init@OPENSSL_1.0.0'
/home/wc/EDCR/EDCR_C/./dDelta/libddelta.so: undefined reference to `SHA256_Init@OPENSSL_1.0.0'
/home/wc/EDCR/EDCR_C/./dDelta/libddelta.so: undefined reference to `SHA256_Update@OPENSSL_1.0.0'
/home/wc/EDCR/EDCR_C/./dDelta/libddelta.so: undefined reference to `MD5_Update@OPENSSL_1.0.0'
collect2: error: ld returned 1 exit status
CMakeFiles/edcr_exec.dir/build.make:121: recipe for target 'edcr_exec' failed
make[2]: *** [edcr_exec] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/edcr_exec.dir/all' failed
make[1]: *** [CMakeFiles/edcr_exec.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
主要原因分析
找不到./dDelta/libddelta.so的OPENSSL_1.0.0依赖,应该是版本问题。
查看当前openssl 版本:
wc@r740:~/EDCR/EDCR_C/dDelta$ openssl version -a
OpenSSL 1.0.2u 20 Dec 2019
built on: reproducible build, date unspecified
platform: linux-x86_64
options: bn(64,64) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: gcc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/usr/local/ssl"
解决方案
没有选择下载openssl (服务器不是我一个人在用,我不想改掉别人的openssl版本)
首先查看依赖路径
wc@r740:~/EDCR/EDCR_C/$ldd ./dDelta/libddelta.so
./libddelta.so: /usr/local/lib/libcrypto.so.1.0.0: no version information available (required by ./libddelta.so)
linux-vdso.so.1 (0x00007ffdc37bf000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f96beb5e000)
libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0 (0x00007f96be6fa000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f96be4dd000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f96be154000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f96bdd63000)
/lib64/ld-linux-x86-64.so.2 (0x00007f96bf2f5000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f96bdb5f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f96bd7c1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f96bd5a9000)
可以看到路径是/usr/local/lib/libcrypto.so.1.0.0
直接从本地(因为我的代码本地是可以运行的,说明是有这个依赖库的)找到libcrypto.so.1.0.0
levi@LEVI1:~/EDCR/EDCR_C$ ldd ./dDelta/libddelta.so
linux-vdso.so.1 (0x00007fffcc9ab000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa02ea20000)
libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fa02e5d0000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fa02e3b0000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa02e020000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa02dc20000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa02f200000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa02da10000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa02d660000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa02d440000)
可以看到位置是/usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0,上传到传到服务器的/usr/local/lib/libcrypto.so.1.0.0即可。
可以运行了
wc@r740:~/EDCR/EDCR_C$ make
Scanning dependencies of target edcr_exec
[ 33%] Building CXX object CMakeFiles/edcr_exec.dir/EstimatingDeltaCompressionRatio.cpp.o
[ 66%] Building CXX object CMakeFiles/edcr_exec.dir/xdelta/xdelta3.cpp.o
[100%] Linking CXX executable edcr_exec
[100%] Built target edcr_exec