从Windows迁移到Ubuntu

9
我曾经使用Microsoft Visual C++在Windows上编程,现在需要将我的一些可移植程序(用可移植C++编写)变成跨平台的,或者至少可以发布适用于Linux和Windows的工作版本。我对Linux应用程序开发完全是新手(而且很少使用该操作系统)。因此,今天我通过Wubi安装了Ubuntu 10.04 LTS,并将Code::Blocks配备了g++编译器作为我的主要武器。然后,我编译了我的第一个Hello World Linux程序,但我对输出程序感到困惑。我可以通过Code::Blocks的“构建和运行”菜单选项运行我的程序,但是当我试图通过文件浏览器(在/media/MyNTFSPartition/MyProject/bin/Release中;是的,我将它保存在我的NTFS分区中)外部启动已编译的应用程序时,程序没有显示出来。为什么?我不知道该怎么办。我需要改变我的“Windows”和“Microsoft Visual Studio”思维方式,转向“Linux”和“Code::Blocks”的思维方式。因此,我提出了以下问题:
  1. 我该如何在IDE之外执行已编译的Linux程序?
    • 在Windows中,我只需运行生成的可执行文件(.exe)。
  2. 我该如何分发我的Linux应用程序?
    • 在Windows中,我只需将可执行文件与相应的DLL文件(如果有)一起分发。
  3. 在Linux中,静态库和动态库的等效物是什么,如何使用它们?
    • 在Windows/Visual Studio中,我只需将所需的库添加到项目设置中的“附加依赖项”中,我的程序将自动链接到所需的静态库/DLL。
  4. 是否可以使用C++库的“二进制形式”(如果提供),这样我就不需要重新编译整个库源代码了吗?
    • 在Windows中,是的。有时会提供预编译的*.lib文件。
  5. 如果我想在Linux上创建一个wxWidgets应用程序,那么我应该选择哪个包适用于Ubuntu?wxGTK还是wxX11?我能在X11下运行wxGTK程序吗?
    • 在Windows中,我使用wxMSW,当然。
  6. 如果问题4的答案是肯定的,那么是否存在预编译的wxX11/wxGTK库?我没有进行过深入的谷歌搜索。

很抱歉提出这么多问题,但我真的对Linux开发基础知识感到困惑。

任何形式的帮助都将不胜感激=)

谢谢。


7
祝你好运。我用Linux很多年了,但为了开发而双启动到Windows,因为Linux的工具感觉像石器时代一样。现在我只使用Windows... - rlbond
2
这个问题最好分成几个问题问,其中一些(例如库的等价物)肯定已经被问过了。 - Georg Fritzsche
1
我认为你使用Qt库和QtCreator集成开发环境会更好。 - Šimon Tóth
4
很有趣,因为我是一名Linux开发人员,与两名Windows开发人员共同在同一个跨平台代码库上工作。当出现困难时,他们经常来找我,因为Linux拥有众多的开发工具,例如'ldd'和nm,而无需像获取"依赖关系检查器"这样的工具。当VS调试器无法提供任何有意义的信息时,他们会转向使用gdb。至于他们请求使用'valgrind'的次数... :) - Troubadour
2
有趣。我用Windows多年,但为了开发而双启动到Linux,因为我发现它配备了更多的开发工具,更加舒适。现在我几乎只使用Linux。这可能取决于你正在进行什么类型的开发。 - Gunther Piez
不同的人有不同的喜好。我从事C++开发,但我就是无法习惯Linux开发。例如,我花了很长时间才弄清楚automake。我仍然无法掌握在gdb中进行高级操作。我知道很多人都非常擅长使用所有这些工具,但对于一个从IDE成长起来的人来说,我就是无法适应它 :( - rlbond
9个回答

16

如何在IDE之外运行已编译的Linux程序?在Windows上,我只需要运行生成的可执行文件(.exe)

在Linux上,你也可以这样做。唯一的区别是在Linux上,默认情况下当前目录不在PATH中,因此通常需要执行以下操作:

./myapp

如果你将当前目录添加到路径中

PATH=".:$PATH"

然后按照类似Windows的方式进行操作

myapp

可以这样做,但出于安全风险的考虑,在共享环境中不建议这样做(您不希望运行别人留下的 /tmp/ls)。

  

如何分发我的 Linux 应用程序?    在 Windows 中,我只需分发可执行文件和相应的 DLL 文件(如果有)

如果您真的想要分发,应该学习 .deb(Ubuntu、Debian)和 .rpm(RedHat、CentOS、SUSE)。 这些都是“软件包”,使用户可以使用特定于发行版的方式轻松安装应用程序。

还有一些安装程序项目,其工作方式类似于 Windows 安装程序生成器,但我建议先学习前者。

  

在 Linux 中,静态库 LIB 和动态库 DLL 的等效物是什么以及如何使用它们?

.a(静态)和 .so(动态)。您可以以与 Windows 上更或多或少相同的方式使用它们,当然要使用 gcc 特定的编译选项。我不使用 Code::Blocks,所以不知道他们的对话框长什么样,最终是将 -llibrary 添加到链接选项中(猜猜:在 Windows 上需要添加 /llibrary ;-))

  

是否可以使用 C++ 库的“二进制形式”(如果提供),以便无需重新编译整个库源代码?

可以。许多库已经存在于 Linux 发行版中。

还要注意,如果您使用 .deb 和 .rpm 进行分发,则可以说“我的应用程序需要安装某些库”,并且这些库将从发行档案中安装。这是推荐的方式,通常不应分发库的副本。

  

如果我想在 Linux 中创建 wxWidgets 应用程序,对于 Ubuntu,我应该选择哪个软件包?wxGTK 还是 wxX11?我能在 X11 下运行 wxGTK 程序吗?

先尝试使用 wxGTK,对话框可能看起来更好,应使用 gnome 主题等。

  

如果问题 4 得到回答是肯定的,那么 wxX11/wxGTK 的预编译库是否存在?没有进行深度谷歌搜索。

请尝试搜索。

apt-cache search wx

(或者启动您的Ubuntu软件中心并搜索wx)

简而言之:您可以在发行版存档中找到所需的一切。


如果可以的话,我会给你点赞两次,因为你提到了使用包中依赖信息作为库的替代,而不是捆绑在一起。 - harms
1
我强烈警告你不要将当前目录添加到PATH中。虽然如果以root身份执行,这只是一个非常非常糟糕的安全问题[令人毛骨悚然],但对于单个用户来说,它肯定足够危险,或者至少会导致一些相当奇怪的意外行为。特别是如果按照你的建议在前面添加它;如果你真的真的想要它在那里,你可能想要将其追加(PATH="$PATH:."),因为你很少想要覆盖已安装的东西。 - Cascabel

3
  1. 导航到您编译程序的文件夹并执行./program
  2. 发送程序以及任何.so文件
  3. .a是静态库,.so是共享库。
  4. 是的,但通常您需要先自行编译它。

不确定wxWidgets发行版。


2

由于Ubuntu自带wxGTK包,因此您应该一定要构建它们。对于开发,您应该使用调试版本,因此最好自己构建,但是对于部署,构建系统提供的软件包似乎更好。

wxX11不如wxGTK,仅在wxGTK不存在或需要比可用版本更新的GTK库的系统上使用。


1
在Ubuntu上,开发库所需的库包通常以“-dev”结尾。例如 - wxGTK 2.8的libwxgtk2.8-dev。您甚至不需要自己编译即可拥有调试版本 - 发行版库的调试符号也被打包了(例如libwxgtk2.8-dbg)。 - caf

1

为什么不坚持你所熟悉的,使用.NET进行开发呢?Ubuntu自带Mono。你可以继续使用Visual C++,或者升级到C#,让你的生活变得更加轻松。


1

对于那些有技术背景的 Linux 新手,一个普遍的建议是:你应该学会正确使用你选择的发行版。

在你的情况下,这意味着学习如何获取 Ubuntu 提供的正确开发包。例如,其他一些人建议你下载你要使用的库的源代码,但更好的方法是使用 Ubuntu 的软件包系统下载你想要编程的库,以及该库的头文件(通常放在单独的软件包中),以及该库的调试符号(也通常在单独的软件包中)。

在 Ubuntu 的“系统”->“管理”菜单中查找Synaptic工具,它允许你搜索互联网上的软件包仓库。你几乎肯定会找到你需要的库的软件包,以及所有工具。


0

当你说你的程序没有出现时,我想你的意思是它在文件浏览器中存在,但是当你双击它时,会出现一个繁忙的光标,然后什么也没有发生?

如果是这样,那么这意味着程序运行失败,可能是因为它找不到链接的动态库。要诊断问题,您可以从终端运行它,然后您将被告知问题所在。

您可能需要阅读ld.so的手册页面,即键入

man ld.so

输入到终端。这会告诉您Linux动态库链接器在运行时查找库的位置。它还会引导您使用另一个有用的工具,称为ldd,如果您正在进行Linux开发,我建议您熟悉一下。


0
1、Unix通常不会为可执行文件设置特定的扩展名,所以myprog.exe就只是myprog。 如果IDE没有自动完成此操作,您可能需要将其设置为可执行文件,输入"chmod +x myprog"。
5、对于wxWindows,我会下载源代码并构建它,检查构建说明,但通常只需要"configure;make;make install"。在Unix系统中,通常从源代码构建库,这样它们可以正确找到您计算机上的所有组件,您还可以获得示例等的源代码。

0

我刚刚添加了一些信息到rlbond的答案中。

  1. 这取决于Linux版本。如果您使用的是Ubuntu,请创建一个deb包。(http://ubuntuforums.org/showthread.php?t=51003)

我可以在X11下运行wxGTK程序吗?

是的,如果您已安装wxGTK软件包 :)


0

这并不是真正回答你的问题,但我认为这是一个有效的建议。
你有两个问题需要解决:

  1. Linux环境。
  2. 确保你的程序是可移植的。

如果我是你,我会在Windows上加载CodeBlocks,并运行Cygwin或Mingw,这将帮助你确保你的代码跨平台可移植。你熟悉这个环境,并且能够克服操作系统障碍,从而获得最大的生产力。

一旦你对以上内容满意,然后将你的代码移动到Linux。此时,任何移植工作都应该是微不足道的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接