我想为 Ubuntu 软件中心制作一个应用程序。所以我想知道可以打包到包中的文件类型。还想知道在 Ubuntu 软件中心发布的应用程序是用什么语言编写的?
我正在尝试使用 Windows 7 和 Qt IDE 为 Ubuntu 软件中心开发应用程序。这可能吗?也就是说,如果我在 Windows 7 平台上开发应用程序,它们可以在 Ubuntu 上运行吗?还是我只能使用 Ubuntu?
答案1
Ubuntu 软件包可以包含什么?
Ubuntu 软件包中可以包含的文件类型没有任何限制。
有你必须包含一些文件--描述软件包内容的文件,通常由您用来制作软件包的任何实用程序创建。但对于您可以包含哪些类型的文件,没有任何技术或其他方面的限制。
可以使用哪些语言来编写可以为 Ubuntu 打包的程序?
对于您可以使用的编程语言没有任何限制,除非您在极少数情况下想要使用以下编程语言:
- 它是一个编译语言并且没有编译器产生可执行文件为了GNU/Linux(实际上,即使针对这个问题,也有一些解决方法。)
- 它是一个解释型语言并且没有解释器对于 GNU/Linux,或者唯一的解释器是专有的,并且您不允许分发它,而您的用户还没有它。
这些情况并不常见。我怀疑它们也适用于你的情况。据我所知,每种可用于生成 Qt 应用程序的编程语言(更准确地说:Qt绑定存在1) 与 Ubuntu 兼容。2具体来说,Qt 最常用的编程语言可能是 C++ 和 Python,这两种语言在 Ubuntu 上都得到了很好的支持。有许多 Ubuntu 应用程序是用这些语言编写的。
当然,为 Windows 编写的程序通常不会自动在 Ubuntu 上运行。通常,尤其是编译为本机代码(例如 C++),您必须以 GNU/Linux 作为目标重新编译程序。通常还需要刻意以某种方式编写程序,以便在您打算支持的每个操作系统上产生所需的行为(有关详细信息,请参阅下文)。但您可以使用几乎任何您想要的语言来执行此操作。
1Qt 有多种语言的绑定(这里列出了一些),并且有些语言能够使用为其他语言编写的库。因此,有人可能会用纯语言编写 Qt 程序X, 在哪里X是一些不能用于编写 Ubuntu 程序的编程语言。但是,据我所知,Qt 开发人员可能考虑使用的每种语言都可用于创建 Ubuntu 程序。当然,您可能选择为同一个程序使用多种语言,如果是这样的话,并非所有语言都必须与 Qt 库交互,并且有些语言可能没有适用于 Ubuntu 的编译器/解释器。这种情况并不常见。
2一种具有 Qt 绑定但不能用于生成在 Ubuntu 上运行的程序的可能候选语言是 C++/CLI,如果你需要生成一个包含托管和非托管代码的可执行文件。(这也适用于旧语言托管 C++。)C++/CLI 具有 Qt 绑定,这意味着有 Qt 的 .NET 绑定;此外,Qt 直接支持原生 C++。因此可以使用任一接口。请注意,C++/CLI 与完全支持普通 C++。此外,您可以用 C++/CLI 编写一个在 Ubuntu 中运行的程序,只要您不需要生成非托管代码。不安全代码,这与非托管代码,仍可工作。
可通过软件中心提供的程序是用什么语言编写的?
有很多。常见的有 C、C++、Python(版本 2 和版本 3)、Java、C# 和 Perl。但 Ubuntu 可以(并且确实)运行用 Objective C、Ruby、Tcl、Lua、Visual Basic .NET、D、Fortran、Golang、Ada、sh、JavaScript、PHP、Haskell、Lisp、Scheme、F# 和许多其他语言编写的程序。如果您愿意,您可以使用某些架构的汇编语言编写程序(或程序的任何部分)。
具体来说,由于您使用的是 Qt:使用 QML(Qt Declarative)编写的界面应用程序可以用于 Ubuntu、Windows 和许多其他平台。(但您不必以声明方式设计用户界面以使其适用于多平台。)
Windows 上的 Qt Creator 可以用来开发 Ubuntu 的应用程序吗?
是的。您可以在 Windows 上使用 Qt Creator 和其他类似的设计工具来制作 Ubuntu 应用程序。Qt Creator 也存在于 Ubuntu 上,它在那里受到全面支持。(如果您想使用最新版本,您可能需要从为 Windows 下载它的同一网站下载它。否则,只需安装该qtcreator
软件包即可。)
在 Windows 上编写代码和创建跨平台 Qt 应用程序的图形界面非常容易。(在 Ubuntu 和其他各种操作系统上也非常容易。)
编译你的程序
交叉编译在 Windows 上为 Ubuntu 编译绝对是可能的,但如果您还没有为各种平台编译过大量软件,那么您可能会发现使用 Ubuntu 系统来构建软件的 Ubuntu 版本更容易。
如果你决定尝试交叉编译,你可以在以下位置安装或构建交叉编译器:赛格威以及其他方式。(请注意,Cygwin 的编译器不会不是默认生成 Linux 可执行文件,而 Cygwin不会运行 GNU/Linux 可执行文件。
如何真正构建在 Windows 上运行并为 GNU/Linux 生成可执行文件的交叉编译器本身就是一个话题,超出了本回答的范围(甚至可能与 Ask Ubuntu 无关)。但是这可能会有帮助。
要测试你的 Ubuntu 软件,你确实需要 Ubuntu(因为Nanne 曾提到)。因此,你应该有一个 Ubuntu 系统。它可以是一个虚拟机。你可以使用虚拟盒在 Windows 上;VMware也可用,但如果您使用免费的 VMware 产品,则应仔细检查许可条款,以确保您可以将其用于商业用途(假设您将您的软件开发活动视为商业活动)。
我猜你的意图是开发跨平台软件,为不同的平台开发不同的版本。具体来说,我猜你正在为 Windows 开发一个版本,为 Ubuntu 开发另一个版本(也许还有其他平台的版本)。
当你为多个平台开发时,选择一个平台是有意义的最多你的开发工作。但是,如果你的目的是开发只是在 Ubuntu 上运行,那么在 Windows 等其他操作系统上进行开发可能没有太多好处。
“如果我在 Windows 7 平台上开发应用程序,它们可以在 Ubuntu 上运行吗?”
你能在 Windows 7 上开发应用程序并使其在 Ubuntu 上运行。在 Windows 上开发的应用程序将不会自动地在 Ubuntu 上运行。
它们也不会在 Windows 上自动运行——我们都有过编写因某种原因而无法运行的代码的经历。但是,这里的重点是:
1.在 Windows 上运行的可执行文件无法在 Ubuntu 上运行。
有一个模拟层叫做葡萄酒有时可以实现这一点。这对用户来说很方便,但是当您开发一个想要在 Ubuntu 上运行的程序时,您几乎从不想依赖它。相反,您需要针对每个想要运行程序的平台分别编译它。
您可能能够使相同的可执行文件在 Fedora 和 Ubuntu 上运行,甚至可以在 FreeBSD 和 Ubuntu 上运行(因为 FreeBSD 大多数情况下可以运行 GNU/Linux 程序),但如果您正在将程序编译为用于真实物理硬件的本机代码,则不应尝试使相同的可执行文件在 Windows 和 Ubuntu 上运行。
我所说的“真实物理硬件的本机代码”是什么意思?好吧,如果你为Java虚拟机(包括几乎所有用以下语言编写的程序)Java), 或者。网 公共语言运行时(包括几乎所有用以下语言编写的程序)C#或其他.NET 语言),那么你的可执行文件实际上由以下部分组成:字节码它特定于 JavaVM 或 CLR,而不是底层计算机及其上运行的操作系统。因此,对于 Java 和 .NET 程序,您通常可以制作一个可在 Windows 和 Ubuntu 上运行的可执行文件。
类似地,如果您使用 Python 等解释型语言编写程序,那么您可以创建可在 Ubuntu 和 Windows 上运行的代码(前提是安装了解释器)。实际上,大多数情况下,Windows 应用程序将包含其所需的解释器,而 Ubuntu 应用程序将声明对提供解释器的软件包的依赖关系。因此,实际上,用解释型语言编写的 Windows 和 Ubuntu 程序通常是针对每个平台单独准备的。
2.有时,要使程序在多个平台上运行,只需针对每个平台分别进行编译即可。但通常,这需要做更多的工作。
不同的操作系统的工作方式有所不同。Qt 框架和标准库无论您选择使用哪种语言,都会提供通常使大多数程序自动跨平台的功能。但有时您可能必须使用底层操作系统功能,要么是为了完成标准库或 Qt 无法完成的任务,要么是为了利用特定于操作系统的功能。
这并不妨碍您编写跨平台程序。它只是使您的程序的某些部分必须针对每个平台进行专门化。也就是说,有时您可能需要以一种方式为一个操作系统实现程序的功能,而以另一种方式为另一个操作系统实现程序的功能。当您为每个平台单独编译程序时,您可以选择要使用哪些特定于操作系统的部分。您还可以经常进行设置,以便自动为您正在构建的任何目标选择适当的代码。
最后,一些包装概念和资源。
您询问的是为 Ubuntu 打包软件时有哪些限制和功能,所以我想提供一些相关信息,以说明您拥有的不同选项以及它们之间的关系。
在以可执行文件形式分发 Ubuntu 软件时,鼓励并建议分发.deb
软件包文件。(如果您只是分发源代码,你的用户必须编译, 然后你能将其放入.deb
包裹中,但通常没有强有力的理由这样做。)
.deb
在 Ubuntu(以及一些其他操作系统,例如Debian)就像.msi
在 Windows 或.pkg
OS X 上一样。使用软件包的操作系统.deb
包含一个叫做dpkg
用于提取、安装、卸载和跟踪已安装的软件包。
dpkg
可由用户手动运行。但大多数情况下并非如此,因为在其上建立了整个基础设施,以进一步自动化安装、删除和升级软件。易于有助于自动.deb
通过互联网获取软件包。还有许多其他程序和服务与 APT 配合使用,为 Ubuntu 提供进一步的软件包管理功能。两个常用的实用程序是软件更新程序(在早期版本的 Ubuntu 中称为更新管理器)和软件中心。
软件中心提供了一种用户友好的方法来浏览软件包。它还提供了一个购买付费软件的系统。分发付费或免费应用程序对于 Ubuntu 用户来说就是使用这个系统(此网站解释了如何, 看出版部分)。
从你问题的措辞来看,我猜这就是你感兴趣的。这可能正是你想要的。但是,你应该知道还有其他选择。无论你希望你的软件免费和开源或者所有权,有多种方法可以将其分发给 Ubuntu 用户:
你可以直接提交到软件中心。 它将被审查;它可能会被拒绝,但大多数能用的软件都会被接受。如果你想为你的软件收费,并且你希望用户能够购买它在软件中心,那么你应该这样做。如果你不想收费,你也可以选择这样做。
你可以从 Launchpad PPA 分发你的软件。如果它是免费的开源软件,您无需为此支付任何费用,并且您的软件不受审查。它将出现在软件中心的搜索结果中,但 Ubuntu 用户可以轻松安装它,并且它将与他们系统中的其他软件一起更新(当您为其创建更新时)。
如果您按照上述说明将您的程序发布到软件中心,这也涉及使用 PPA,但您的软件需要接受审查并被允许专有。
您可以创建自己的
.deb
软件包文件,并自行分发。这样,您的程序就无需接受审查,而且可能是专有的,您甚至可以为此收费。这就像自己分发其他任何东西一样。一般来说,它不涉及您与用户/客户和托管提供商以外的任何人之间的任何合同关系。(当然,您仍然必须遵循您使用的任何软件的许可证,并且您只能合法地将许可证允许的软件包含在您的程序中。顺便说一句,我不是律师,这也不是法律建议。)你可以发布程序的源代码,让用户自己编译。这样你的程序就无需接受审查,你和托管提供商和客户以外的任何人之间通常不存在合同关系,如果你的托管提供商允许这样做,你的程序甚至可以是专有的。
但是,大多数专有软件的作者都倾向于对其源代码保密,因此如果您正在创建专有软件,则此选项可能不适合您。(“源代码可用”和“开源”并不意味着同一件事,但大多数闭源软件也将其源代码保持未发布状态。)
无论您的软件是如何获得许可的,仅以源代码形式提供的缺点之一是用户必须自己编译它,因此他们可能会遇到困难,而技术水平较低的用户可能不愿意尝试安装该软件。
如果你的程序是免费的开源软件,你可以提交并纳入 Debian。由于 Ubuntu 是基于 Debian 的,因此它也会出现在 Ubuntu 的后续版本中。通常,您会先以其他方式分发它,然后再执行此操作。
有时,即使 Debian 中没有软件包,也可以提交到 Ubuntu。请参阅Ubuntu 打包指南。
由于 Ubuntu 打包指南提供了与向 Ubuntu 用户分发软件的几乎所有技术相关的大量信息,无论您计划如何分发软件,我都强烈建议您查看它。
您可以为您的程序制作自己的二进制安装程序,类似于
.exe
Windows 中的安装程序。在 Windows 中,这种做法有些不被鼓励(尽管仍然很流行且有效),而且它只很少这是您在 Ubuntu 中的最佳选择。但它只是一个选择,并且有一些非常成功的软件(如 MATLAB)以这种方式“打包”用于 GNU/Linux 系统。