这篇文章主要围绕linux–如何使用CPack以特定方式为QT应用程序打包依赖项?展开,旨在为您提供一份详细的参考资料。我们将全面介绍linux–如何使用CPack以特定方式为QT应用程序打包依赖项?
这篇文章主要围绕linux – 如何使用CPack以特定方式为QT应用程序打包依赖项?展开,旨在为您提供一份详细的参考资料。我们将全面介绍linux – 如何使用CPack以特定方式为QT应用程序打包依赖项?,同时也会为您带来c – 在Linux上为Qt应用程序获取root访问权的正确方法、c – 如何为我的开源应用程序打包Linux二进制文件?、c – 自动为QT应用程序创建类图的工具、c# – 如何使用MonoDevelop打包我的linux应用程序?的实用方法。
本文目录一览:- linux – 如何使用CPack以特定方式为QT应用程序打包依赖项?
- c – 在Linux上为Qt应用程序获取root访问权的正确方法
- c – 如何为我的开源应用程序打包Linux二进制文件?
- c – 自动为QT应用程序创建类图的工具
- c# – 如何使用MonoDevelop打包我的linux应用程序?
linux – 如何使用CPack以特定方式为QT应用程序打包依赖项?
我正在尝试打包它以便分发.我遇到了查找依赖项并将其打包并以惯用方式执行此操作的问题(IOW:没有硬编码的DLL路径或包含我的源代码库中的DLL)
对于Windows端口,我正在使用MinGW并进行如下编译:
mingw64-cmake -G "Unix Makefiles" .. -DCMAKE_INSTALL_PREFIX=../install -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=/usr/share/mingw/toolchain-mingw64.cmake make && ctest && make install && cpack -G "TGZ" && cpack -G "NSIS64"
我已将其设置为生成tar.gz文件和NSIS安装程序.目前没有特别的理由让NSIS而不是Wix.这只是为了解决问题.
它编译Windows可执行文件,但它不包括运行该程序所需的DLL.就是这些:
Libgcc_s_seh-1.dll Qt5Core.dll Qt5Gui.dll
在我的计算机上快速查找显示这些DLL存在于此处:
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/Qt5Widgets.dll /usr/x86_64-w64-mingw32/sys-root/mingw/bin/libgcc_s_seh-1.dll ...
有没有办法自动让CPack挖掘DLL并将它们包含在安装程序中?
这是我的CMakeLists.txt文件:
cmake_minimum_required(VERSION 2.8.11) project(myapp) enable_testing() set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) find_package(Qt5Core required) find_package(Qt5Gui required) find_package(Qt5Widgets required) add_executable(myapp WIN32 main.cpp mainwindow.cpp resources.qrc) target_link_libraries(myapp Qt5::Widgets) target_link_libraries(myapp Qt5::Core) target_link_libraries(myapp Qt5::Gui) INSTALL(TARGETS myapp BUNDLE DESTINATION . RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib ) INSTALL(FILES ${CMAKE_INSTALL_SYstem_RUNTIME_LIBS} DESTINATION bin COMPONENT Libraries) IF(CMAKE_INSTALL_SYstem_RUNTIME_LIBS) INSTALL(PROGRAMS ${CMAKE_INSTALL_SYstem_RUNTIME_LIBS} DESTINATION bin COMPONENT System) ENDIF(CMAKE_INSTALL_SYstem_RUNTIME_LIBS) INCLUDE(CPack)
我四处寻找一些帮助.我遇到的最好的事情是
this link
但它看起来并不那么惯用.如果我们仔细观察CMakeLists.txt文件,它将获得特定于机器的硬编码路径,这些路径将来肯定会发生变化:
IF( WIN32 AND ${ARCH_32BIT}) SET(QT_INSTALLED_PATH "C:/QtMSVCX86/Qt5.5.0/5.5/msvc2013" ) ELSEIF(WIN32 AND ${ARCH_64BIT}) SET(QT_INSTALLED_PATH "C:/QtMSVCX64/Qt5.5.0/5.5/msvc2013_64" ) ELSEIF(UNIX AND NOT MINGW AND ${ARCH_32BIT}) SET(QT_INSTALLED_PATH "/opt/Qt5.5.0/5.5/gcc/" ) ELSEIF(UNIX AND NOT MINGW AND ${ARCH_64BIT}) SET(QT_INSTALLED_PATH "/opt/Qt5.5.0/5.5/gcc_64/" ) ENDIF() SET(CMAKE_AUTOMOC ON) SET(CMAKE_AUTOUIC ON) SET(CMAKE_AUTORCC ON) FIND_PACKAGE(Qt5Widgets PATHS ${QT_INSTALLED_PATH} NO_DEFAULT_PATH) FIND_PACKAGE(Qt5Qml PATHS ${QT_INSTALLED_PATH} NO_DEFAULT_PATH) FIND_PACKAGE(Qt5Quick PATHS ${QT_INSTALLED_PATH} NO_DEFAULT_PATH)
解决方法
c – 在Linux上为Qt应用程序获取root访问权的正确方法
美好的一天
背景:
我正在为Linux系统创建一个OpenVPN包装器应用程序,该应用程序即将完成.我遇到了一些障碍.
OpenVPN需要root访问权来修改路由表(添加和删除路由).这是事情变得模糊和混乱的地方.
希望通过扩展this question,可以共享一些行业标准答案和解决方案.
文档:
因此,经过几个小时的搜索,我编制了一个获取root访问权限的可能方法列表,但是似乎没有一个是官方的,也没有任何真正可靠的指导来获得这个SU特权.
让我们考虑以下方法.
1.使用pkexec& polkits
有关最佳做法的一些信息,请查找官方freedesktop polkit documentation here和here
使用pkexec和polkits在线发现了一些教程
– here,这帮我创建了我的polkit文件.
– SO Thread
– 用于Qt应用程序的lovely small tutorial
关于pkexec和polkits的简要解释(我的理解):
> polkits:
polkits由行动和规则组成(参见深入阅读和解释的文件).它定义了应用程序的操作以及与之关联的规则.规则可以定义为属于特定组的用户,其中操作查询规则,成功传递规则,用户自动进行身份验证(没有弹出密码提示),否则他们需要输入管理员密码
> pkexec:
用于与polkit操作进行交互并对应用程序进行身份验证以获取root访问权限的应用程序.
这些需要在/usr/share / polkit-1 / actions /和/usr/share/polkit-1/rules.d/中添加操作(在其他目录中,请参阅所有位置的文档)
这种方法似乎很好用(但需要更多的解释才能轻松理解,imo)
注意:有qt-polkit库可供使用,请参阅他们的github repository
对于简单的TL; DR版本,请参阅this
我创建的polkit文件(注意这可能不正确,但它对我有用):
可以找到/添加的位置(还有其他位置)
/usr/share/polkit-1/actions
Policy Kit文件名:
com.myappname.something.policy //需要.policy
注意:
com.myappname.something
被称为政策的命名空间(阅读文档,这将不清楚)
政策套件内容
vendor>
<vendor_url>http://myappurl.com/vendor_url>
关于我的政策文件的注释(重要的位)
>这只是一个示例,请参阅官方示例和说明的文档:
>< vendor>我的应用名称< / vendor>是应用程序名称,它可以有空格
>< action id =“com.myappname.something.myaction-name”>这里有任何动作名称.
>注意!
文件名 – > com.myappname.something.policy和,
动作ID – > com.myappname.something.myaction-name应该具有相同的命名空间
>图标名称应与最新的freedesktop图标规格here一致
TL; DR(或不想):
图标位置是:
1. /home/yourusername/.icons (sometimes not there)
2. /home/yourusername/.local/share/icons
2. /usr/share/icons
只要它们符合大小并且是.png,您只能传递文件名(省略格式)
>非常重要:
当调用pkexec< myappname>,并且没有这些行时(老实说,我不太确定它们的用途),会遇到类似这样的错误:
2017-12-19 12::58:24 Fatal: QXcbConnection: Could not connect to display ((null):0,(null))
Aborted (core dumped)
注意:保持密钥相同,但是您可以并且可能应该将exec.path密钥更改为您的应用程序位置.
政策工具包如何运作?
简而言之,如果你回顾前面提到的可爱的example(并跳过所有非常相似的文件名),它就变得清晰了.
当一个人跑:
pkexec
这会调用本地身份验证代理以root身份运行应用程序(在我们的示例中).
这由动作(上面提到的策略工具包)处理.此外,规则利用动作id来执行附加查询等,这些可以在上面提供的示例中查看.
输入管理员密码后,根据输入默认值的“设置”(参见here),我们有:
auth_admin_keep
Like auth_admin but the authorization is kept for a brief period (e.g. five minutes).
因此,用户可以(在我的OpenVPN应用程序中)在接下来的5分钟内连接到OpenVPN连接,直到再次请求密码.
2. Sudo(/ etc / sudoers):
这似乎是大多数需要root访问权限的用户的方法,但不建议:
例如通过使用参数调用singleShot QProcess,在运行主应用程序之前检查root访问权限:
/bin/sh -c sudo -v
将导致各种Linux发行版中的退出代码为1(从而导致我搜索备选方案)
3. setuid():
一个非常好的example可以在这里找到,不幸的是它似乎不适用于现代Linux发行版,因为它是一个很容易被利用的安全漏洞.
简而言之,该过程需要一个:
chmod +x
并使用getuid()检查是否在应用程序中设置了s位以获取用户ID,并使用getgid()获取用户的组ID.
这些函数可以在以下定义的Linux头文件中找到:
nes structs
nes methods
但是,这似乎不适用于现代Linux系统.以下是执行s位设置的root拥有的应用程序的输出,作为普通(非特权)用户运行:
2017-12-19 12::21:08 Fatal: FATAL: The application binary appears to be running setuid,this is a security hole. ((null):0,(null))
Aborted (core dumped)
告别,setuid()
4.其他方法:
> PAM
进一步阅读,见
> man page
> tutorial/explanation
>关于跨平台PAM整合的QT Forum问题
> QT用户模式
Qt提供了small implementation for acquiring root access,但它仅适用于使用yum包管理器的Linux发行版.
关于此问题的后续问题,见this QT Forum question
问题:
上面可能只包括一小部分可用的方法来获取root访问权限,但考虑到某些应用程序是全局使用的,它们经常被攻击或撬开甚至受到攻击.
在做了这项研究之后,它扩大了我的知识,但没有给我一个推荐的确定方法,但只提示.
题:
上面哪种方法在工业上是首选的,即何时我应该使用另一种方法(PAM vs polkits vs simple sudo),如果有其他方法可用,这些是首选吗?
最佳答案
However,this does not seem to work with modern day Linux systems.
Here is the output of executing a root owned application with the s
bit set,run as a normal (unprivileged) user:
2017-12-19 12::21:08 Fatal: FATAL: The application binary appears to be running setuid,(null))
上述错误与现代Linux系统无关.它是对使用setuid而不理解它的愚蠢开发人员的Qt保护.
只需致电
QCoreApplication::setSetuidAllowed(true)
当你的应用程序启动时,你可以做setuid()就好了.您甚至可以在下载到“普通”用户之前运行特权命令.
摘要:
您的Qt应用程序必须具有root所有者,并且setuid位设置.示例debmaker是我想要执行特权操作的Qt应用程序.所以在我建立debmaker之后,我做了:
sudo chown root:root debmaker
sudo chmod 4755 debmaker
(后者设置setuid位)
现在运行Qt应用程序
./debmaker
应用程序做的第一件事是检查geteuid()== 0和getuid()== 1000(1000是我的用户ID,0是根)
然后它启动一个新进程(在Qt中使用QProcess).这将以特权模式运行. (示例我的子进程称为chroot)
现在通过调用将主应用程序(我的debmaker)放到正常的用户级别
setuid(getuid());
chroot(子进程)将继续以root用户身份运行.
主应用程序现在不再以提升模式运行,但可以将请求发送到仍在提升模式下运行的子进程.
QProcess *chroot = new QProcess;
blah blah setup the chroot and start it
chroot->write("chown root:root /home/oosman/foo");
最后一行将向子进程发送消息.您在子进程中读取stdin,解析命令,检查它以确保它不是恶意的(或恶意取决于您的意图!)并执行命令.
c – 如何为我的开源应用程序打包Linux二进制文件?
我有一个开源应用程序,我目前只发布Windows版本的二进制文件.此时,Linux用户必须获取源代码并进行编译.是否有发布Linux二进制文件的标准方法?
我的应用程序是用c / c编译的,用gcc编译,我使用的唯一外部Linux代码是X Windows和CUPS.
c – 自动为QT应用程序创建类图的工具
我尝试了BOUML和Umbrello,但是它们都有一些类的问题.
我正在研究Ubuntu.
解决方法
我过去曾经使用它,即使没有按要求对代码进行评论,它也能够生成非常好的(尽管很复杂的)图表.
引用Features在线文档部分:
Uses the dot tool of the Graphviz tool kit to generate include dependency graphs,collaboration diagrams,call graphs,directory structure graphs,and graphical class hierarchy graphs.
Automatically detects public,protected and private sections,as well as the Qt specific signal and slots sections. Extraction of private class members is optional.
Although doxygen can Now be used in any project written in a language that is supported by doxygen,initially it was specifically designed to be used for projects that make use of Qt Software’s Qt toolkit. I have tried to make doxygen `Qt-compatible’. That is: Doxygen can read the documentation contained in the Qt source code and create a class browser that looks quite similar to the one that is generated by Qt Software. Doxygen understands the C++ extensions used by Qt such as signals and slots and many of the markup commands used in the Qt sources.
c# – 如何使用MonoDevelop打包我的linux应用程序?
我的计划包括:
>一个库项目(“生成器”),用我的程序创建的数据.
>使用Gtk#的ui(“接口”)项目.这个项目有两个子目录:“glade”(gtk用于构建小部件的xml文件)和“book”(我的程序使用的数据).
>库和接口项目使用的实用程序项目(“Utils”).
>刚刚启动界面的主项目(“MyProgramName”).
(我想)我想做的事情非常简单(我认为):
>编译我的应用程序
>复制.exe和.dll文件(到/usr/local / bin?)
>复制“book”目录(到/usr/local / bin?)
>复制“glade”目录(到/usr/local / bin?)
哦,我想这样做.deb包.我想如果我能让tarball工作,那么.deb包应该不会太麻烦,但这就是我最终要做的事情.
我仍然不确定如何做到这一点.我用MonoDevelop创建了一个Tarball.当我安装tarball(使用./configure,make,sudo checkinstall)时,它似乎安装了可执行代码(甚至创建了一个运行该程序的命令),但忘记了“book”和“glade”目录.
我该怎么做呢?对不起,如果这是一个基本/广泛的问题.我一直在谷歌搜索,我似乎找不到任何不认为我知道包装的基本知识的东西(即使它声称它不承担这一点).
解决方法
>在构建目录中安装tarball.
>使用控制文件添加DEBIAN目录.我发现this article很有帮助.
>使用dpkg –build创建包.
我将从学习GNU的autotools开始:autoconf和automake.它们使得在构建目录中安装程序变得非常容易.你提到过./configure.所以我假设这个项目已经有了一些结构.从描述中,听起来像项目可能需要……
> configure.in中的条目用于“book”和“glade”中的文件.
>“book”和“glade”中的Makefile.am文件.
将所有内容放在一起,以下命令将生成名为project.deb的包文件.
# ./configure --prefix build/usr # make && make install # dpkg --build build project.deb
我们今天的关于linux – 如何使用CPack以特定方式为QT应用程序打包依赖项?的分享就到这里,谢谢您的阅读,如果想了解更多关于c – 在Linux上为Qt应用程序获取root访问权的正确方法、c – 如何为我的开源应用程序打包Linux二进制文件?、c – 自动为QT应用程序创建类图的工具、c# – 如何使用MonoDevelop打包我的linux应用程序?的相关信息,可以在本站进行搜索。
本文标签: