我是一名软件工程师,主要在Windows操作系统中使用VC++和C++进行开发。
在Linux环境下编写C++代码是否存在重大差异?
还是只需要在需要在Linux中编写C++代码时进行一些调整即可?
在Linux编程世界中,与Windows世界您熟悉的那种方式非常不同。您必须理解并习惯它。一旦您理解了它,就会不想回来。
您有许多小而好的工具,这些工具彼此配合使用,而不是一个MSVC解决方案。例如:
在Linux中,您有一个作为独立工具的编译器(Gnu编译器集合),您有一个作为独立工具的构建系统(autotools、CMake)。您有GNU调试器作为独立工具,还有非常好的编辑器作为独立工具(如hard core vim/emacs)。
虽然有集成开发环境如Eclipse、Netbeans、KDevelop、Anjuta,但仍需理解其工作原理。
您应该明白每个分开的工具都非常强大,并与其他工具集成。
操作系统级API的设计是简单的。您很少会发现像CreateProcessEx那样有数不清的参数,而是有简单的fork()
+exec()
。man手册是您在所有涉及系统API和标准C库的领域上的好朋友。
GUI-您有两个大型GUI库Qt/GTK。 Qt是伟大的C++库,使GUI开发成为一项令人愉悦的工作(不像MFC)。GTK具有C和C++ API GTK和GTKmm(没有与它们的经验)。
i18n/l10n/unicode-这就是Linux编程使生活变得更加轻松的地方。几乎所有内容都是UTF-8的。没有宽API烦恼,没有使用简单的fopen或ifstream打开文件名为中文的问题,也没有无法打开带有Unicode名称的文件的第三方库。可用于gettext的伟大内置工具以及类似KBabel的良好翻译工具包。
库-这就是Linux编程让您厌恶Windows的地方。几乎每个免费库都已安装或可以通过简单的apt-get
或yum install
获取。没有调试/发布不兼容的烦恼,没有DLL_EXPORT-ing,简单而强大,制作共享对象就像使用静态库一样简单(大多数根本不使用静态库)。
我的看法
(我是一个与Windows开发有很多交集的Linux程序员)...
这取决于你使用了多少与Windows相关的内容。C++的标准部分是相同的,但仅使用它不会让你比命令行应用程序更进一步。
还有整个makefile而不是让VS为您构建的事情。根据您在Linux中决定使用的工具(或IDE),这可能会有很大的区别。
我在两个平台上都有相当多的工作经验,并且喜欢它们两个,但总的来说,我发现大多数开发人员喜欢其中一个并讨厌另一个。
我会将*nix环境描述为“极客友好型”:您可以使用许多出色且非常灵活的工具。其中一些工具会引入较高的学习曲线,而有些则仅仅因为某种原因(如make)而仍然很受欢迎,但如果您愿意花些时间来适当地学习它们,那么回报是很高的。实际上,即使在Windows上工作时,我也使用许多*nix工具:vim、grep、perl等。
另一方面,Windows平台提供了比POSIX更多功能的Win32 API,文档非常完善,并得到非常好的工具支持。Windows上的调试器(特别是windbg)通常比我尝试过的任何*nix调试器更强大,尽管gdb通常对于大多数任务已经足够好了。可执行文件的部署也比Linux世界更容易——事实上,在Linux上部署软件的唯一真正可靠的方法是通过config/make在客户机上构建源代码。
看一下在Linux和Windows上都可以运行的一些开源项目的源代码。通常情况下,超过80%的代码是相同的,而且项目越大,系统特定部分的比例就越小。不幸的是,在系统特定代码中可能存在难点(线程,非阻塞网络IO,GUI细节)。
我能想到一些主要的区别:
一个典型的Windows程序员,习惯于使用Visual C++,可能会发现Linux C++编程的以下方面是新颖或困难的:
Linux编程不是Linux编程,而是Unix编程。Unix编程的根源比Windows的MS-DOS根源要深得多,在许多地方都能看到这一点。
Windows程序员倾向于考虑环境,他们往往首先考虑IDE工具(GUI编辑器、编译器、调试器)。Unix程序员往往分为各种部落,许多核心Unix(Linux)C++程序员非常习惯在没有IDE的情况下从命令行工作,有些人则使用类似于Visual Studio风格的Linux IDE,其中有许多种。
我个人发现,在获得感觉和环境氛围之前,我必须学会阅读(也许是写)makefile,从源代码构建一堆标准的Linux/Unix应用程序(并理解如何通过步骤“自动配置”和各种“--命令行选项”进行输入),
除非你是经验丰富的Linux系统管理员,否则你可能希望坚持使用适合新手的Linux发行版(如Ubuntu)。