我需要为大学写一个小程序。 问题是,它必须在Linux下的C / C ++中,而我从来没有使用过Linux,所以我预计在IDE,编译等方面会遇到很多问题。
是否有可能在Windows下编码,然后“复制/粘贴”的代码,并在linux下编译? 如果可能的话,我应该知道什么是局限性?
这将是一个小程序,典型的使用套接字的客户/服务器通信。
我想你应该继续在Linux(gcc?)下执行。 这会教你一些关于“老派”编程的东西。 忘记使用IDE,使用vim(如果你已经得到它)或者nedit(更像记事本)。
在命令行编译。 自己链接。 写一个make文件来做到这一点。
这是基础知识。 在使用IDE之前,您需要了解它。 在你还在上大学的时候这样做,因为这是一种痛苦,你会(而且应该)想用IDE来做实际的工作!
另外,对Unix的基本理解并不难(我已经找到了来自Windows背景的Solaris,Ubuntu和OS X的方法) – 一些简单的教程应该能让你运行起来。 为了编写小型学校项目,你不需要知道多少东西: cd
, ls
, mkdir
, make
, gcc
(确保使用g++
for C ++项目 – 在我的Mac之前,我已经咬过我了)。 靠近你的主目录( ~
)。
在目标系统上执行你的项目会帮助你正确地得到某些东西:当做这些简单的socket和pthreads的例子时,我发现编译和链接它们是非平台可移植的。 在某些系统上,图书馆的链接需要这样做,而其他的则是这样。
顺便说一句 :如果你真的想在Windows下这样做,最好的办法是在Windows下有一个POSIX环境。 如果我没有记错,POSIX套接字与Windows网络模型是不同的。
尝试MinGW或Cygwin。 两者都应该给你在Windows下的* nix开发环境。 你可以使用你最喜欢的文本编辑器(VIM的Windows端口?)和cmd.exe而不是bash来启动编译器:)
编辑 :对不起,如果语气是对抗(根据评论)。 我会尽量软化一下。 只是……我见过不少人试图用IDE学习C / C ++(或者Java),并相信他们会从头开始。 当然,你需要更好的工具来处理现实生活中的项目,但是学校项目的项目文件等开销却增加了。 这也使得你的作业更难以发送给你的老师 – 带有一堆.c和.h文件的压缩文件以及一个makefile文件真的很简单。
如果你需要在Windows中编码,我建议使用mingw / msys作为开发环境。 Msys在windows上实现了一个类似unix的shell,而mingw是gnu编译器集合(gcc)的一个端口,其他的gnu构建工具也是windows平台的工具。 这是一个开源项目,非常适合这个任务。
安装过程可能有点棘手,但是我发现最好的地方在这里 。
从技术上讲,你可以编写很多代码,只需要在windows和linux平台上进行很少的修改。
但是,在某些情况下,事情会变得棘手。 从linux-> windows而不是从windows-> linux往往更容易,只是因为windows用户倾向于使用没有linux等效的Windows API调用。
如果您要使用GUI,则需要尝试使用跨平台GUI。 Qt或wxWidgets是很好的选择。 特别是,Qt还有许多跨平台的实用程序类,它们不属于GUI空间,可能会帮助解决套接字问题。
如果你的目标只是为了让它在linux上运行,而且软件不需要在Windows上运行,那么我建议你从一开始就跳入其中,试着让它在那里工作。 这将比尝试移植更容易。
至于Linux IDE – 在某些时候,计划跳入并使用Linux工具 – 您将需要一个不同的构建系统(除非使用像cmake或scons这样的跨平台解决方案),如果您使用IDE,将会有不同的IDE等等
KDevelop是一个不错的IDE,如果你习惯在一个集成的IDE中工作的话,它将比从命令行尝试所有事情更加熟悉。
看看QT库和工具
不是剪切和粘贴,而是将项目划分为平台不可知的文件和特定于平台的文件和/或使用预处理器指令来定制代码。 我的大部分工作都是针对Windows的,使用熟悉的工具将它作为Linux工具的测试平台是很好的。
首先:安装Cygwin,这为MingW没有提供的POSIX API fork()
例如fork()
提供了UNIX环境。 所以你可以在windows下工作,就像在Linux中一样。
第二:我建议习惯Linux /安装它,知道Linux / UNIX环境会让你在大学(而不仅仅是在那里)的生活变得容易得多。
如果您只能使用标准C库编写程序,那么理论上它应该已经是跨平台兼容的,因为C库本身被设计为完全可移植的。 也就是说,你会遇到套接字的问题,除非我弄错了通常是特定的实现。
Linux(尤其是Ubuntu)并不是很难使用,但是缺乏一个真正的开发IDE通常会引起人们的注意。 我推荐的是,你使用Cygwin for windows进行编译,并尝试一个名为CodeBlocks的代码编辑器。 Cygwin将会针对Linux库而不是Windows来编译你的代码(然后在你运行它的时候使用windows.dll来模拟这些库),所以这是熟悉你的限制的好方法。 你应该可以在windows下建立一个CodeBlocks项目,然后在Linux版本的CodeBlocks下打开同样的项目并测试你的编译。
我承认,跨平台的代码不是非常容易编写的,但是这只是一点努力而已。
Windows和Unix风格的平台都提供Berkeley套接字 API,但Windows实现有一些差异,例如使用WSAStartup()
和WSACleanup()
函数。 除此之外,几个#ifdef
和应用程序将在两个平台上编译没有任何问题。 假设它应该是一个简单的命令行应用程序。 有一节将套接字应用程序移植到 MSDN 上的Winsock 。 你所要做的就是反向工作。 ;)
另外阅读一本关于套接字编程的书籍,例如Beej的“网络编程指南” 。
另一种选择是使用Boost :: Asio 。 这非常顺利地隐藏了任何套接字API差异。
我同意其他人的看法,如果你安装了像Ubuntu Linux这样的东西,学习起来并不难。 但是要回答您的实际问题,主要的问题是避免无意中使用Windows API。 我最喜欢的环境是AT&T的U / Win工具集,它被设计用于在Windows上编译POSIX应用程序。 与mingw相比,这似乎减少了开发者的投诉,反过来,他们的投诉也比cygwin少。
如果你坚持C / C ++标准,你不应该有一个问题,从Windows到Unix的移植良好的代码,一些小的调整包括头等。
我猜测,除了命令行以外,没有其他的GUI,因为它在linux下是一个客户机/服务器分配,这使得它成为可能。 但要非常小心,坚持使用unix风格套接字和C / C ++标准,而不要使用任何Windows库或快捷方式。
胡安,
如果你疯狂地学习Linux的方法,那么你就没有耐心去做一个程序员。 编码不是魅力,它需要一丝不苟的努力,阅读文档,尝试一些东西,盯着调试器几个小时。
你需要重新考虑参与编程,或者重新考虑,努力学习导航Linux,这是远远不够复杂的任何有用的编程语言。
如果它不使用Windows API特定的代码或非跨平台的库,并且它是标准的C ++ – 如果它不使用微软编译器特定的功能,那么它应该是跨平台的,并且在linux上工作。
随Linux提供的编译器被称为GCC。 有一个叫做MinGW的Windows版本。 你可以尝试之前尝试在Linux上。 如果它编译在MinGW上,它肯定会在Linux上编译。 (问题是MinGW没有与最新版本的GCC保持一致…)
对于不是跨平台的库(也许是GUI库)的使用,你将不得不改变它们,但是大多数非特定于操作系统的GUI库都是跨平台的。 对于其他图书馆,我猜你会发现在其他平台上的等价物。