跨平台编程

时间:2009-05-07 19:11:24

标签: c++ c windows linux cross-platform

我需要为大学写一个小程序。问题是,它必须在Linux下的C / C ++中,而且我从未使用过Linux,我预计IDE,编译等等都会遇到很多问题。

是否有可能在Windows下编码,然后“复制/粘贴”代码并在linux下编译?如果可能的话,我应该知道哪些限制?

这将是一个小程序,使用套接字的典型客户端/服务器通信。

12 个答案:

答案 0 :(得分:27)

我认为你应该继续在Linux下进行(gcc?)。这将教你一些关于'老派'编程的东西。忘记使用IDE,使用vim(如果你已经得到它)或nedit(更像是记事本)。

在命令行上编译。自己链接。写一个make文件来做这件事。

这是基础知识。在使用IDE之前,您需要了解它。 在你还在大学的时候这样做,因为这很痛苦,你会(并且应该)想要使用IDE进行实际工作!

另外,对Unix的基本了解并不难实现(我已经找到了绕过Solaris,Ubuntu和OS X的方法,来自Windows背景) - 一些简单的教程应该可以让你运行起来。对于编写小型学校项目,您需要了解的内容不多:cdlsmkdirmakegcc(务必使用{ {1}}对于C ++项目 - 在我的Mac上咬过我之前...)。靠近您的主目录(g++)。

在目标系统上执行项目将帮助您正确地获取某些内容:在执行这些简单的套接字和pthread示例时,我发现编译并将它们链接为非平台可移植的。在某些系统中,库中的链接需要通过这种方式进行,其他方式则是这样。

BTW :如果您真的想在Windows下执行此操作,最好的办法是在Windows下安装POSIX环境。如果我没记错的话,POSIX套接字与Windows网络模型不同。

尝试使用MinGW或Cygwin。两者都应该在Windows下为您提供* nix开发环境。您可以使用自己喜欢的文本编辑器(vim的Windows端口?)和cmd.exe而不是bash来启动编译器:)

编辑:对不起,如果语气是对抗性的(根据评论)。我会试着稍微软化一下。这只是......我看到很多人试图用IDE学习C / C ++(或Java),并且开始相信它们会妨碍它们的开始。当然,你需要更好的工具用于现实生活中的程序,但是学校样本项目的项目文件等的开销会增加混乱。它还使您的作业更难以通过电子邮件发送给您的老师 - 带有一堆.c和.h文件的zip文件和一个makefile非常简单......

答案 1 :(得分:8)

如果您需要在Windows中进行编码,我建议您使用mingw/msys作为开发环境。 Msys在windows上实现类似unix的shell,mingw是windows平台的gnu compiler collection (gcc)和其他gnu构建工具的端口。它是一个开源项目,非常适合这项任务。

安装过程可能有点棘手,但我发现最好的起点是here

答案 2 :(得分:7)

从技术上讲,您可以编写大量代码,这些代码可以在Windows和Linux平台上进行很少的更改。

然而,在某些情况下,事情变得棘手。从linux开始通常更容易 - >窗户比窗户 - > linux,只是因为Windows用户倾向于使用没有linux等效的Windows API调用。

如果您要使用GUI,则需要尝试使用跨平台GUI。 Qt或wxWidgets是不错的选择。特别是,Qt还有许多不在GUI空间之外的跨平台实用程序类,可能有助于解决套接字问题。

如果您的目标只是让它在Linux上工作,并且该软件不必在Windows上运行,我建议您从一开始就试图让它在那里工作。这比尝试移植更容易。

至于Linux IDE - 在某些时候,计划跳入并使用Linux工具 - 你需要一个不同的构建系统(除非你使用像cmake或scons这样的跨平台解决方案),如果有不同的IDE,如果你使用IDE等

KDevelop是一个不错的IDE,如果您习惯在集成的IDE中工作,那么比从命令行尝试所有操作更熟悉。

答案 3 :(得分:5)

答案 4 :(得分:4)

不是剪切和粘贴,而是将项目划分为平台无关文件和平台特定文件和/或使用预处理器指令来自定义代码。我的大部分工作都是针对Windows的,并且很高兴使用它作为Linux内容的测试平台,使用熟悉的工具。

答案 5 :(得分:4)

首先:安装Cygwin,这为具有MingW未提供的POSIX API的Windows提供了类似UNIX的环境,例如fork()。所以你可以在Windows中工作,感觉就像在Linux中一样。

第二:我建议习惯Linux /安装它,因为知道Linux / UNIX环境会让你在大学(而不仅仅是那里)的生活变得更加轻松。

答案 6 :(得分:3)

如果您只使用标准C库编写程序,那么理论上它应该已经是跨平台兼容的,因为C库本身设计为完全可移植的。也就是说,你将遇到套接字的问题,除非我错了通常是特定于实现的。

Linux(特别是ubuntu)并不是那么难用,但缺乏真正的开发IDE通常会让人失望。我建议您使用Cygwin for windows进行编译,并在执行此操作时尝试使用名为CodeBlocks的代码编辑器。 Cygwin将针对Linux库而不是windows库编译您的代码(然后在运行时使用windows .dll模拟这些库),因此这是熟悉您的限制的好方法。您应该能够在Windows下设置CodeBlocks项目,然后在Linux版本的CodeBlocks下打开相同的项目并测试您的编译。

我承认,跨平台代码写起来并不是非常容易,但只需付出一点努力就可以了。

答案 7 :(得分:2)

Windows和Unix风格的平台都提供Berkeley Sockets API,但Windows实现有一些差异,例如:使用WSAStartup()WSACleanup()函数。除此之外,一些#ifdef和应用程序将在两个平台上编译而没有任何问题。假设它当然应该是一个简单的命令行应用程序。 MSDN上有一个Porting Socket Applications to Winsock部分。你所要做的就是向后工作。 ;)

另请阅读有关套接字编程的书籍,例如Beej's Guide to Network Programming

另一种选择是使用Boost::Asio。这非常顺利地隐藏了任何套接字API差异。

答案 8 :(得分:2)

我同意其他人的意见,如果你安装像Ubuntu Linux这样的东西,那就不难学了。但要回答您的实际问题,主要问题是避免无意中使用Windows API。我最喜欢的环境是AT& T U/Win工具集,它专为在Windows上编译POSIX应用程序而设计。它似乎减少了开发人员的投诉而不是mingw,这反过来比cygwin产生的投诉更少。

答案 9 :(得分:1)

如果你坚持使用C / C ++标准,那么你应该没有问题将编写良好的代码从windows移植到unix,只需稍微调整一下包含的标题等等。

我猜测除了命令行之外没有GUI,因为它在linux下进行了客户端/服务器分配,这使得它成为可能。但要非常小心,你坚持使用unix样式套接字和C / C ++标准,而不是使用任何Windows库或快捷方式。

答案 10 :(得分:1)

涓,

如果你只是在疯狂地学习Linux,那么你就没有耐心成为程序员。编码不是魅力,它需要细致的工作,阅读文档,尝试解决问题,盯着调试器几个小时。

你需要重新考虑参与编程或者学习如何学习导航Linux,这远远不如任何有用的编程语言那么复杂。

答案 11 :(得分:0)

如果它不使用Windows API特定代码或非跨平台库,并且它是标准C ++ - 如果它不使用微软编译器特定功能 - 那么它应该是跨平台的并且可以在linux上工作。 / p>

Linux提供的编译器称为GCC。有一个名为MinGW的Windows版本。您可以在尝试使用linux之前尝试一下。如果它在MinGW上编译,它肯定会在Linux上编译。 (问题是MinGW与最新版本的GCC不一致......)

对于不是跨平台的库(可能是GUI库)的使用,您将不得不更改它们,但是大多数非特定于操作系统的GUI库仍然是跨平台的。对于其他库,我猜你会在其他平台上找到相同的库。