Ich habe den Quellcode einer in Qt/C++ geschriebenen Anwendung, die ich versuchen kann, unter Linux zu erstellen.
Das System ist Ubuntu 19.04. Die Anwendung erfordert einige ältere Paketversionen, z. B. openssl-1.0.2.
Ich habe nach der Installation die folgenden Schritte ausgeführt, um Qt 5.11 einzurichten:
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
Nach den obigen Schritten wird die Anwendung in Qt kompiliert, beim Erstellen trat jedoch der folgende ld
Fehler auf:
Libssl konnte nicht gefunden werden. Libcrypto konnte nicht gefunden werden.
Ich denke, das liegt daran, dass diese Bibliotheken als statisch verknüpfte .a
Bibliotheken und nicht als gemeinsam genutzte Objektbibliotheken vom Typ .so existieren.
Ich habe versucht, es .so
wie folgt aufzubauen:
cd /opt/openssl-1.0.2l
./config shared
make install
Dies schlägt fehl mit:
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
Die Frage ist also, wie man openssl-1.0.2 dazu bringt, libssl.so und libcrypt.so unter Ubuntu 19.04 zu erstellen.
Antwort1
Der ./config --shared
Befehl ergänzt -fPIC
die Makefiles CFLAGS
, wodurch alle C-Dateien in einer Form kompiliert werden, die für die Einbindung in eine gemeinsam genutzte Bibliothek geeignet ist.
.o
Allerdings verfügen alle Dateien, die während des statischen Standardbuilds bereits in Objektcode (Dateien) kompiliert wurden, nicht über die entsprechenden CFLAGS
. Der Versuch, diese Dateien in eine gemeinsam genutzte Bibliothek einzubinden, schlägt fehl.
Die Lösung besteht darin, vor dem Ausführen mit der neuen Konfiguration der gemeinsam genutzten Bibliothek make clean
alle Dateien zu löschen ..o
make install