我有一个用 Qt/C++ 编写的应用程序的源代码,我可以尝试在 Linux 上构建它。
系统是 Ubuntu 19.04。该应用程序需要一些旧版本的软件包,例如 openssl-1.0.2。
我在安装后运行了以下步骤来设置 Qt 5.11:
sudo su -
apt-get install build-essential
apt-get install qtcreator
apt-get install qt5-default
apt-get install git
apt-get install qtwebengine5-dev
apt-get install qtmultimedia5-dev
apt-get install qtscript5-dev
apt-get install open-vm-tools-desktop
cd /opt
wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz
gunzip openssl-1.0.2l.tar.gz
tar xf openssl-1.0.2l.tar
cd openssl-1.0.2l/
./config
make install
ln -s /opt/openssl-1.0.2l/include/openssl/ /usr/include/openssl
apt install libleptonica-dev
apt-get install tesseract-ocr
apt-get install libtesseract-dev
apt-get install libvlc-dev
完成上述步骤后,应用程序在 Qt 中编译,但构建给出了ld
错误:
找不到 libssl 找不到 libcrypto
我认为这是因为这些库作为静态链接库存在.a
,而不是作为 .so 共享对象库存在。
我尝试构建.so
如下:
cd /opt/openssl-1.0.2l
./config shared
make install
这失败了:
make[2]: Entering directory '/opt/openssl-1.0.2l'
[ -z "" ] || gcc -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 -Iinclude \
-DFINGERPRINT_PREMAIN_DSO_LOAD -o fips_premain_dso \
fips_premain.c fipscanister.o \
libcrypto.a -ldl
make[3]: Entering directory '/opt/openssl-1.0.2l'
make[4]: Entering directory '/opt/openssl-1.0.2l'
/usr/bin/ld: libcrypto.a(gost_eng.o): relocation R_X86_64_PC32 against symbol `stderr@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: nonrepresentable section on output
collect2: error: ld returned 1 exit status
make[4]: *** [Makefile.shared:169: link_a.gnu] Error 1
make[4]: Leaving directory '/opt/openssl-1.0.2l'
make[3]: *** [Makefile:357: do_linux-shared] Error 2
make[3]: Leaving directory '/opt/openssl-1.0.2l'
make[2]: *** [Makefile:310: libcrypto.so.1.0.0] Error 2
make[2]: Leaving directory '/opt/openssl-1.0.2l'
make[1]: *** [Makefile:109: shared] Error 2
make[1]: Leaving directory '/opt/openssl-1.0.2l/crypto'
make: *** [Makefile:287: build_crypto] Error 1
所以问题是,如何让 openssl-1.0.2 在 Ubuntu 19.04 上生成 libssl.so 和 libcrypt.so。
该
./config --shared
命令添加-fPIC
到 Makefile 中CFLAGS
,这会导致任何 C 文件以适合链接到共享库的形式编译。.o
但是,在默认静态构建期间已经编译为目标代码(文件)的任何文件都没有适当的CFLAGS
. 尝试将这些文件链接到共享库将失败。解决方案是在使用新的共享库配置运行之前运行
make clean
以删除所有.o
文件。make install