From 3fed1d918055e4f383c86d0c599fd54e20b7f3cf Mon Sep 17 00:00:00 2001 From: taynpg Date: Thu, 11 Apr 2024 13:33:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=A7=8B=E5=86=99=E4=B8=BB=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 7 ++++- MainWidget.cpp | 85 +++++++++++++++++++++++++++++++++++++++++++++++--- MainWidget.h | 17 ++++++++++ MainWidget.ui | 7 +++-- 4 files changed, 109 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 65a7ac0..b6eca1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ project(packqt VERSION 0.1 LANGUAGES CXX) set(CMAKE_PREFIX_PATH "/home/typ/Qt5.14.2/5.14.2/gcc_64" + "/home/typ/Dev/Boost" ) set(CMAKE_AUTOUIC ON) @@ -24,6 +25,10 @@ if (MSVC) add_compile_options(-D_CRT_SECURE_NO_WARNINGS) endif() +set(Boost_USE_STATIC_LIBS ON) +find_package(Boost REQUIRED filesystem) +include_directories(${Boost_INCLUDE_DIR}) + set(PROJECT_SOURCES main.cpp MainWidget.cpp @@ -54,7 +59,7 @@ else() endif() endif() -target_link_libraries(packqt PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) +target_link_libraries(packqt PRIVATE Qt${QT_VERSION_MAJOR}::Widgets ${Boost_LIBRARIES}) # Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. # If you are developing for iOS or macOS you should consider setting an diff --git a/MainWidget.cpp b/MainWidget.cpp index b7727f7..96ba179 100644 --- a/MainWidget.cpp +++ b/MainWidget.cpp @@ -6,6 +6,7 @@ MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget ui->setupUi(this); setWindowTitle("打包Qt工具"); connect_operator(); + control_init(); } MainWidget::~MainWidget() { delete ui; } @@ -20,7 +21,17 @@ void MainWidget::connect_operator() connect(ui->btnGenerate, &QPushButton::clicked, this, [=]() { generate(); }); } -void MainWidget::add_env_btn() +void MainWidget::control_init() +{ + ui->plainTextEdit->setEnabled(false); +#if !defined (NDEBUG) + ui->edBinary->setText("/home/typ/Downloads/build-QXmlEdit-Desktop_Qt_5_14_2_GCC_64bit-Release/build/qxmledit"); + ui->edQtDir->setText("/home/typ/Qt5.14.2/5.14.2/gcc_64"); + ui->edOutDir->setText("/home/typ/testpack"); +#endif +} + +void MainWidget::add_env_btn() { QString env = SelectDirectory(this, nullptr); if (env.isEmpty()) { @@ -29,12 +40,58 @@ void MainWidget::add_env_btn() ui->listWidget->addItem(env); } -void MainWidget::generate() -{ +void MainWidget::simple_log(const QString& info) { ui->plainTextEdit->appendPlainText(info + "\n"); } +std::vector MainWidget::get_depend_on(const std::string& name, const std::vector& env) +{ + std::vector vec; + std::string cmd{}; + + if (!env.empty()) { + cmd.append("export LD_LIBRARY_PATH=$LD_LIBRARY_PATH"); + for (const auto& data : env) { + cmd.append(":" + data); + } + } + cmd.append(" && ldd " + name); + char buffer[1024]{}; + FILE* pf = nullptr; + if ((pf = popen(cmd.c_str(), "r")) == nullptr) { + return vec; + } + std::string result{}; + while (std::fgets(buffer, sizeof(buffer), pf)) { + result.append(buffer); + } + + boost::split(vec, result, boost::is_any_of("\t")); + return vec; } -void MainWidget::del_env_btn() +std::vector MainWidget::handle_result(const std::vector& vec) +{ + std::vector ret; + for (const auto& data : vec) { + if (data.empty()) { + continue; + } + std::string tdata = boost::replace_all_copy(data, "=>", ""); + std::vector vt; + boost::split(vt, tdata, boost::is_any_of(" ")); + if (vt.size() != 4) { + QString info = "长度不对,原始数据:\n" + QString::fromStdString(data); + simple_log(info); + continue; + } + if (boost::starts_with(vt[2], "/lib")) { + continue; + } + ret.push_back(vt[2]); + } + return ret; +} + +void MainWidget::del_env_btn() { QListWidgetItem* item = ui->listWidget->currentItem(); if (!item) { @@ -84,4 +141,24 @@ bool MainWidget::isOk(QWidget* parent, const QString& title, const QString& cont } else { return true; } +} + +void MainWidget::message(QWidget* parent, const QString& content) { QMessageBox::information(parent, "提示", content); } + +void MainWidget::generate() +{ + ui->plainTextEdit->clear(); + envs_.clear(); + + binary_ = ui->edBinary->text().trimmed(); + fs::path binary_dir = fs::path(binary_.toStdString()).parent_path(); + envs_.push_back(binary_dir.string()); + + int env_cnt = ui->listWidget->count(); + for (int i = 0; i < env_cnt; ++i) { + envs_.push_back(ui->listWidget->item(i)->text().toStdString()); + } + + auto retPrevious = get_depend_on(binary_.toStdString(), envs_); + auto result = handle_result(retPrevious); } \ No newline at end of file diff --git a/MainWidget.h b/MainWidget.h index c643223..509327a 100644 --- a/MainWidget.h +++ b/MainWidget.h @@ -6,6 +6,12 @@ #include #include #include +#include +#include +#include +#include + +namespace fs = boost::filesystem; QT_BEGIN_NAMESPACE namespace Ui { @@ -23,16 +29,27 @@ public: private: void connect_operator(); + void control_init(); void add_env_btn(); void del_env_btn(); void generate(); + void simple_log(const QString& info); + +private: + std::vector get_depend_on(const std::string& name, const std::vector& env); + std::vector handle_result(const std::vector& vec); private: static QString SelectDirectory(QWidget* parent, QLineEdit* pEdit, const QString& pre_path = ""); static QString SelectFile(QWidget* parent, QLineEdit* pEdit, const QString& info, const QString& filter); static bool isOk(QWidget* parent, const QString& title, const QString& content); + static void message(QWidget* parent, const QString& content); private: Ui::MainWidget* ui; + +private: + QString binary_{}; + std::vector envs_{}; }; #endif // MAINWIDGET_H diff --git a/MainWidget.ui b/MainWidget.ui index 13bce06..34af9c7 100644 --- a/MainWidget.ui +++ b/MainWidget.ui @@ -6,8 +6,8 @@ 0 0 - 1026 - 739 + 1057 + 778 @@ -179,6 +179,9 @@ + + +