Сборка проекта Qt 6.9.2 в Ubuntu 24.04C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Сборка проекта Qt 6.9.2 в Ubuntu 24.04

Сообщение Anonymous »

Я столкнулся с проблемой при создании приложения для портативной версии. Я написал скрипт для автоматизации сборки:

Код: Выделить всё

#!/bin/bash
set -e

# ==============================================
APP_NAME="flygenapp"
EXECUTABLE_PATH="/home/cxz/Desktop/CODE/GITLAB/flygenapp/flygenapp/build/Desktop_Qt_6_9_3-Release/flygenapp"
SOURCE_ROOT="/home/user/repos/flygenapp/flygenapp"
ICON_PATH="$SOURCE_ROOT/img/drone.png"
PACKAGE_DIR="portable_flygenapp"
OUTPUT_ARCHIVE="${APP_NAME}_portable_ubuntu.tar.gz"
QT_ROOT="/home/cxz/Qt/6.9.3/gcc_64"

if [ ! -f "$EXECUTABLE_PATH" ]; then
echo "ERROR: bin not found: $EXECUTABLE_PATH"
exit 1
fi

if ! command -v patchelf &> /dev/null; then
echo "ERROR: patchelf not found!"
exit 1
fi

# ==============================================
if [ -z "$QT_ROOT" ] || [ ! -d "$QT_ROOT/lib" ]; then
QMAKE_PATH=$(which qmake6 2>/dev/null || which qmake 2>/dev/null)
if [ -n "$QMAKE_PATH" ]; then
QT_ROOT=$(dirname $(dirname $(readlink -f "$QMAKE_PATH")))
fi
fi

if [ -z "$QT_ROOT" ] || [ ! -d "$QT_ROOT/lib" ]; then
QT_PATH_FROM_BIN=$(strings "$EXECUTABLE_PATH" | grep -oE "/Qt/6\.9\.[0-9]+/gcc_64" | head -1)
if [ -n "$QT_PATH_FROM_BIN" ] && [ -d "$QT_PATH_FROM_BIN/lib" ]; then
QT_ROOT="$QT_PATH_FROM_BIN"
fi
fi

if [ -z "$QT_ROOT" ] || [ ! -d "$QT_ROOT/lib" ]; then
echo "ERROR: Qt 6.9.3 not found."
exit 1
fi

echo "Using Qt: $QT_ROOT"

QT_PLUGINS_DIR="$QT_ROOT/plugins"
QT_QML_DIR="$QT_ROOT/qml"
QT_LIB_DIR="$QT_ROOT/lib"
QT_LIBEXEC_DIR="$QT_ROOT/libexec"
QT_RESOURCES_DIR="$QT_ROOT/resources"
QT_TRANSLATIONS_DIR="$QT_ROOT/translations"

if [ ! -f "$QT_PLUGINS_DIR/platforms/libqxcb.so" ]; then
echo "ERROR: libqxcb.so not found in $QT_PLUGINS_DIR/platforms/"
exit 1
fi

# ==============================================
GLX_PLUGIN_SRC="$QT_PLUGINS_DIR/platforms/libqxcb-glx-plugin.so"
if [ -f "$GLX_PLUGIN_SRC" ]; then
cp "$GLX_PLUGIN_SRC" "$PACKAGE_DIR/plugins/platforms/"
echo " + libqxcb-glx-plugin.so"
USE_SOFTWARE_RENDERING=0
else
echo "WARNING: software rendering"
USE_SOFTWARE_RENDERING=1
fi

# ==============================================
QT_VERSION_IN_BINARY=$(strings "$EXECUTABLE_PATH" | grep -E "Qt_6\.9" | head -1 || echo "unknown")
echo "Version Qt in bin: $QT_VERSION_IN_BINARY"
if [[ "$QT_VERSION_IN_BINARY" != *"Qt_6.9"* ]]; then
echo "ERROR: Waiting Qt 6.9, found: $QT_VERSION_IN_BINARY"
exit 1
fi

# ==============================================
echo "Creating structure..."
rm -rf "$PACKAGE_DIR"
mkdir -p "$PACKAGE_DIR"/{bin,lib,libexec,resources,translations/qtwebengine_locales,plugins/{platforms,imageformats,styles},qml,share/icons/hicolor/256x256/apps,scripts}

cp "$EXECUTABLE_PATH" "$PACKAGE_DIR/bin/$APP_NAME"
chmod +x "$PACKAGE_DIR/bin/$APP_NAME"

# ==============================================
echo "Copying system files .so..."
ldd "$PACKAGE_DIR/bin/$APP_NAME" | grep "=>" | awk '{print $3}' | while read lib; do
if [[ -f "$lib" && "$lib" != *"$QT_LIB_DIR"* && "$lib" != *"/lib/"*ld-linux* ]]; then
cp -L "$lib" "$PACKAGE_DIR/lib/" 2>/dev/null || true
fi
done

# ==============================================
echo "Copying Qt Libraries..."
cp "$QT_LIB_DIR"/libQt6*.so.6 "$PACKAGE_DIR/lib/" 2>/dev/null || true

echo "Copying libQt6XcbQpa.so.6"
if [ -f "$QT_LIB_DIR/libQt6XcbQpa.so.6" ]; then
cp "$QT_LIB_DIR/libQt6XcbQpa.so.6" "$PACKAGE_DIR/lib/"
echo " + libQt6XcbQpa.so.6"
else
echo "ERROR: libQt6XcbQpa.so.6 not found! GUI will not start."
exit 1
fi

cp "$QT_LIB_DIR/libQt6DBus.so.6" "$PACKAGE_DIR/lib/"  2>/dev/null || true

# ==============================================
echo "Copying ICU..."

ICU_REAL_LIBS=(
"$QT_LIB_DIR/libicudata.so.73.2"
"$QT_LIB_DIR/libicuuc.so.73.2"
"$QT_LIB_DIR/libicui18n.so.73.2"
)

for real_lib in "${ICU_REAL_LIBS[@]}"; do
if [ ! -f "$real_lib" ]; then
echo "ERROR: $real_lib not found!"
exit 1
fi
cp -a "$real_lib" "$PACKAGE_DIR/lib/"
echo " + $(basename "$real_lib")"
done

ln -sf libicudata.so.73.2   "$PACKAGE_DIR/lib/libicudata.so.73"
ln -sf libicudata.so.73.2   "$PACKAGE_DIR/lib/libicudata.so"
ln -sf libicuuc.so.73.2     "$PACKAGE_DIR/lib/libicuuc.so.73"
ln -sf libicuuc.so.73.2     "$PACKAGE_DIR/lib/libicuuc.so"
ln -sf libicui18n.so.73.2   "$PACKAGE_DIR/lib/libicui18n.so.73"
ln -sf libicui18n.so.73.2   "$PACKAGE_DIR/lib/libicui18n.so"

# ==============================================
echo "Copying platform plugins..."
mkdir -p "$PACKAGE_DIR/plugins/platforms" "$PACKAGE_DIR/plugins/imageformats" "$PACKAGE_DIR/plugins/styles"

cp "$QT_PLUGINS_DIR/platforms/libqxcb.so" "$PACKAGE_DIR/plugins/platforms/"
cp "$QT_PLUGINS_DIR/platforms/libqminimal.so" "$PACKAGE_DIR/plugins/platforms/" 2>/dev/null || true
cp "$QT_PLUGINS_DIR/platforms/libqoffscreen.so" "$PACKAGE_DIR/plugins/platforms/" 2>/dev/null || true

GLX_PLUGIN="$QT_PLUGINS_DIR/platforms/libqxcb-glx-plugin.so"
cp "$GLX_PLUGIN" "$PACKAGE_DIR/plugins/platforms/"
echo " + libqxcb-glx-plugin.so"

cp "$QT_PLUGINS_DIR/imageformats/"*.so "$PACKAGE_DIR/plugins/imageformats/" 2>/dev/null || true
cp "$QT_PLUGINS_DIR/styles/"*.so "$PACKAGE_DIR/plugins/styles/" 2>/dev/null || true

# ==============================================
echo "Copying OpenGL libraries..."
GL_LIBS=(
"/usr/lib/x86_64-linux-gnu/libGLX_mesa.so.0"
"/usr/lib/x86_64-linux-gnu/libEGL_mesa.so.0"
"/usr/lib/x86_64-linux-gnu/libGLX.so.0"
"/usr/lib/x86_64-linux-gnu/libEGL.so.1"
"/usr/lib/x86_64-linux-gnu/libGLdispatch.so.0"
)

for lib in "${GL_LIBS[@]}"; do
if [ -f "$lib" ]; then
cp -L "$lib" "$PACKAGE_DIR/lib/" 2>/dev/null && echo " + $(basename "$lib")"
else
echo " WARNING: $lib not found"
fi
done

# ==============================================
echo "Copying QtWebEngineProcess..."
WEBENGINE_PROCESS_SRC="$QT_LIBEXEC_DIR/QtWebEngineProcess"
if [ -f "$WEBENGINE_PROCESS_SRC" ]; then
mkdir -p "$PACKAGE_DIR/libexec"
cp "$WEBENGINE_PROCESS_SRC" "$PACKAGE_DIR/libexec/QtWebEngineProcess"
chmod +x "$PACKAGE_DIR/libexec/QtWebEngineProcess"
echo " + QtWebEngineProcess"
else
echo "ERROR: QtWebEngineProcess not found"
exit 1
fi

# ==============================================
echo "Copying WebEngine Resources..."
if [ -d "$QT_RESOURCES_DIR" ]; then
mkdir -p "$PACKAGE_DIR/resources"
cp -r "$QT_RESOURCES_DIR/"* "$PACKAGE_DIR/resources/" 2>/dev/null || true
echo " + WebEngine Resources"
else
echo "ERROR: Resourses not found"
exit 1
fi

# ==============================================
echo "Copying WebEngine Locales..."
if [ -d "$QT_TRANSLATIONS_DIR/qtwebengine_locales" ]; then
mkdir -p "$PACKAGE_DIR/translations/qtwebengine_locales"
cp "$QT_TRANSLATIONS_DIR/qtwebengine_locales/"*.pak "$PACKAGE_DIR/translations/qtwebengine_locales/" 2>/dev/null || true
echo " + WebEngine Locales"
fi

# ==============================================
echo "Copying QML modules..."
QML_MODULES=(
"QtQuick" "QtQuick.2" "QtQml" "QtLocation" "QtPositioning"
"QtQuick/Controls" "QtQuick/Layouts" "QtQuick/Dialogs" "QtQuick/Window"
"QtQuick/Templates" "QtQuick/Particles" "Qt5Compat"  "Qt5Compat/GraphicalEffects"
"QtWebEngine" "QtWebChannel"
"QtQuick/Controls/Basic"
)

for mod in "${QML_MODULES[@]}"; do
src="$QT_QML_DIR/$mod"
dst="$PACKAGE_DIR/qml/$mod"
if [ -d "$src" ]; then
mkdir -p "$dst"
cp "$src/qmldir" "$dst/" 2>/dev/null || true
cp "$src/"*.so "$dst/" 2>/dev/null || true
cp "$src/"*.qml "$dst/" 2>/dev/null || true
cp "$src/"*.js "$dst/" 2>/dev/null || true
echo " + QML: $mod"
else
echo " WARNING: QML modules not found: $mod"
fi
done

# ==============================================
echo "Installing RPATH in bin..."
patchelf --set-rpath '$ORIGIN/../lib' "$PACKAGE_DIR/bin/$APP_NAME"

# ==============================================
echo "RPATH patching in plugins and libexec..."
find "$PACKAGE_DIR/plugins" -name "*.so" -exec patchelf --set-rpath '$ORIGIN/../../lib' {} \; 2>/dev/null || true
patchelf --set-rpath '$ORIGIN/../../lib' "$PACKAGE_DIR/libexec/QtWebEngineProcess" 2>/dev/null || true

find "$PACKAGE_DIR/lib" -name "*.so*" -exec patchelf --set-rpath '$ORIGIN' {} \; 2>/dev/null || true

# ==============================================
if [ -f "$ICON_PATH" ]; then
mkdir -p "$PACKAGE_DIR/share/icons/hicolor/256x256/apps"
cp "$ICON_PATH" "$PACKAGE_DIR/share/icons/hicolor/256x256/apps/flygenapp.png"
echo "Icon is copied."
else
echo "WARNING: Icon not foud: $ICON_PATH"
fi

# ==============================================

# run.sh
cat > "$PACKAGE_DIR/scripts/run.sh"  "$PACKAGE_DIR/scripts/install.sh" 

Подробнее здесь: [url]https://stackoverflow.com/questions/79819881/building-the-qt-6-9-2-project-on-ubuntu-24-04[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»