как статически связать приложение qt - PullRequest
0 голосов
/ 26 марта 2019

У меня есть простое консольное приложение с ядром qt, Раньше я строил проект с qt 5.11, и все было хорошо, но когда он закончился 5.12, появилась следующая проблема:

Я строю qt следующим образом:

./configure -confirm-license -prefix $BASE_DIR/$QT_DIR -release -qt-pcre -qt-zlib -optimize-size -static -no-opengl -no-openssl -opensource -nomake tests -nomake examples -no-gui -no-widgets -no-dbus -no-accessibility    

qt успешно собран, но когда я собираю свое приложение со статическим флагом, оно начинает требовать динамические библиотеки (хотя этого не должно быть, и все было в порядке с qt 5.11) и не произойдет из-за этого.

export PATH=$PATH:$BASE_DIR/$QT_DIR
$BASE_DIR/$QT_DIR/bin/qmake -r QMAKE_LFLAGS+="-static -static-libgcc -static-libstdc++" $BASE_DIR/CQtDeployer.pro    

Вот ошибка сборки:

g++ -static -Wl,-O1 -Wl,--gc-sections -o build/release/cqtdeployer main.o   -L/media/D/own/Console-QtDeployer/QuasarAppLib/build/release -lQuasarApp -L/media/D/own/Console-QtDeployer/Deploy/build/release -lDeploy -L/media/D/own/Console-QtDeployer/pe/pe-parser-library/build/release -lpe-parser-library -L/media/D/own/Console-QtDeployer/staticQt/lib -lQt5Core -lm /media/D/own/Console-QtDeployer/staticQt/lib/libqtpcre2.a /usr/lib/x86_64-linux-gnu/libdl.so /usr/lib/x86_64-linux-gnu/libgthread-2.0.so /usr/lib/x86_64-linux-gnu/libglib-2.0.so -lpthread   
/usr/bin/ld: attempted static link of dynamic object `/usr/lib/x86_64-linux-gnu/libdl.so'
collect2: error: ld returned 1 exit status
Makefile:117: recipe for target 'build/release/cqtdeployer' failed
make[1]: *** [build/release/cqtdeployer] Error 1
make[1]: выход из каталога «/media/D/own/Console-QtDeployer/CQtDeployer»
Makefile:178: recipe for target 'sub-CQtDeployer-make_first-ordered' failed
make: *** [sub-CQtDeployer-make_first-ordered] Error 2

ОБНОВЛЕНО

Это больше похоже на ошибку qmake. Дело в том, что я изменил список библиотек, необходимых для компоновки в моем make-файле, на

LIBS          = $(SUBLIBS) -L/media/D/own/Console-QtDeployer/QuasarAppLib/build/release -lQuasarApp -L/media/D/own/Console-QtDeployer/Deploy/build/release -lDeploy -L/media/D/own/Console-QtDeployer/pe/pe-parser-library/build/release -lpe-parser-library -L/media/D/own/Console-QtDeployer/staticQt/lib -lQt5Core -lm /media/D/own/Console-QtDeployer/staticQt/lib/libqtpcre2.a -ldl -lglib-2.0 -lpthread

и все заработало, я получил правильный двоичный файл.

до редактирования было:


CC            = gcc
CXX           = g++
DEFINES       = -DWITHOUT_BASE_TESTS -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_CORE_LIB
CFLAGS        = -pipe -O2 -Wall -W -ffunction-sections -fdata-sections -D_REENTRANT -fPIC $(DEFINES)
CXXFLAGS      = -pipe -O2 -std=gnu++1y -Wall -W -ffunction-sections -fdata-sections -D_REENTRANT -fPIC $(DEFINES)
INCPATH       = -I. -I../QuasarAppLib -I../Deploy -I../pe/pe-parser-library/include -I../staticQt/include -I../staticQt/include/QtCore -I. -I../staticQt/mkspecs/linux-g++
QMAKE         = /media/D/own/Console-QtDeployer/staticQt/bin/qmake
DEL_FILE      = rm -f
CHK_DIR_EXISTS= test -d
MKDIR         = mkdir -p
COPY          = cp -f
COPY_FILE     = cp -f
COPY_DIR      = cp -f -R
INSTALL_FILE  = install -m 644 -p
INSTALL_PROGRAM = install -m 755 -p
INSTALL_DIR   = cp -f -R
QINSTALL      = /media/D/own/Console-QtDeployer/staticQt/bin/qmake -install qinstall
QINSTALL_PROGRAM = /media/D/own/Console-QtDeployer/staticQt/bin/qmake -install qinstall -exe
DEL_FILE      = rm -f
SYMLINK       = ln -f -s
DEL_DIR       = rmdir
MOVE          = mv -f
TAR           = tar -cf
COMPRESS      = gzip -9f
DISTNAME      = cqtdeployer1.0.0
DISTDIR = /media/D/own/Console-QtDeployer/CQtDeployer/.tmp/cqtdeployer1.0.0
LINK          = g++
LFLAGS        = -static -static-libgcc -static-libstdc++ -Wl,-O1 -Wl,--gc-sections
LIBS          = $(SUBLIBS) -L/media/D/own/Console-QtDeployer/QuasarAppLib/build/release -lQuasarApp -L/media/D/own/Console-QtDeployer/Deploy/build/release -lDeploy -L/media/D/own/Console-QtDeployer/pe/pe-parser-library/build/release -lpe-parser-library -L/media/D/own/Console-QtDeployer/staticQt/lib -lQt5Core -lm /media/D/own/Console-QtDeployer/staticQt/lib/libqtpcre2.a /usr/lib/x86_64-linux-gnu/libdl.so /usr/lib/x86_64-linux-gnu/libgthread-2.0.so /usr/lib/x86_64-linux-gnu/libglib-2.0.so -lpthread   
AR            = ar cqs
RANLIB        = 
SED           = sed
STRIP         = strip

Мой профессиональный файл:

#
# Copyright (C) 2018-2019 QuasarApp.
# Distributed under the lgplv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.
#

QT -= gui

CONFIG += c++14 console
CONFIG -= app_bundle

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG(release, debug|release): {
    DESTDIR="$$PWD/build/release"
} else {
    DESTDIR="$$PWD/build/debug"
}

include('$$PWD/../QuasarAppLib/QuasarLib.pri')
include('$$PWD/../Deploy/Deploy.pri')
include('$$PWD/../pe/pe-parser-library/pe-parser-library.pri')


TARGET = cqtdeployer

SOURCES += \
        main.cpp \


win32: RC_ICONS = $$PWD/../res/icon.ico

может быть, вам нужно каким-то особенным образом настроить qmake?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...