从Windows迁移到Linux [关闭]


57

我需要调和这两个事实:

  1. 在Linux上工作时,我感到不舒服。
  2. 我需要为Linux开发软件。

背景知识:我在Windows上有10年以上的编程经验(几乎全部是C / C ++,但也有一些.NET),我在家里使用FreeBSD大约3年左右(然后不得不回到Windows),而我从来没有对Linux感到过运。现在,我必须为Linux开发软件。我需要一个计划。

在Windows上,您只需要了解一种编程语言,要针对其进行编码的API,您的IDE(VisualStudio)以及一些非常基本的故障排除工具(Depends,ProcessExplorer,DebugView,WinDbg)就可以摆脱困境。其他一切都是自然而然的。

在Linux上,这是一个非常不同的故事。如果我从Firefox插件链接到哪个DLL(抱歉,共享库),我怎么会知道呢?在Linux中相当于在源中插入__asm int 3 / DebugBreak()并运行程序,然后让OS调用调试器,这等效于Linux?为什么地狱版本的构建使用称为appLoader的东西,而调试版本的工作却有所不同?最糟糕的是:如何配置Linux开发环境?

因此,考虑到仇恨通常与不够了解有关,您会建议什么?我对Emacs和GCC没问题。我需要以Linux管理员/用户的身份接受教育,并且需要学习适当的故障排除工具(strace很酷,顺便说一句),与我上面提到的工具相当。

我需要从头开始做Linux吗?还是我只需要阅读一些书籍(我已经阅读了Kernighan的“ UNIX编程环境”和Stevens的“ Advanced Programming ...”,但我需要学习一些更实际的东西)?还是我需要在家用计算机上安装一些Linux发行版?


73
我对Windows也有同样的感觉

15
考虑过再找一份您更喜欢的工作?

3
在Unices man是您的朋友。我会man nm并且man ld以此作为起点。
Dietbuddha 2011年

1
开始使用Windows;)
Jigar Joshi

1
“其他所有事情都是自然而然的”吗?当然是自然而然的,您已经做了10年了。Linux并不差,它却有所不同。现在您已经十岁了,您的大脑不再像以前那样容易地学习新事物,而所有这些不同的事物都变成了您必须学习的东西。用“ Linux糟透了”来处理整件事将使您的生活痛苦不堪。
JesperE

Answers:


62

您可能会发现有趣的文章Linux和Windows中的动态链接,它解释了每个OS如何进行动态链接。文章共享库搜索路径说明,这两个库是如何发现。此外静态,动态共享和可装载Linux的图书馆是非常好的。关于Linux库的一个好处是,它们比Windows具有更好的版本控制支持,并且具有多个版本的库(AFAIK,我不使用Windows)。有关详细信息,请参见Solaris和Linux中的库接口版本控制。这些文章确实应该使您对库有所了解。

GDB非常强大,一个很好的介绍可能是RMS的gdb Tutorial。您可能需要阅读条件断点。有关等效内容,__asm(int 3)请参见在Linux上针对gdb以编程方式在C或C ++代码中设置断点问题。

Marc Rochkind 的《高级Unix编程》一书是必读的恕我直言。有很多示例,并且以很好的解释方式涵盖了所有POSIX / SUS主题。这是迄今为止我读过的关于该主题的最好的书。

但是为了使您的生活更轻松,我实际上建议使用高级API为您抽象一些东西,例如Qt。也使跨平台的编写变得容易得多。

从头开始做Linux可以帮助您了解Linux系统的组成,但是从开发人员的角度来看,我认为这并不能帮助您提高对Linux的了解。但是,当您了解Linux环境中的哪些部分(以及部分原因)时,它的确使您对Linux更加满意。在通过Linux From Scratch工作之后,Linux对您来说并不是一个大麻烦。


当然,在32位系统上,如果该进程已在调试,该中断将进入调试器。如果我要问的就是这个。陷阱发生,Windows允许附加调试器。在某些情况下,这非常方便。并感谢您的链接!
rincewind 2011年

6
好答案!注意,对于gdb教程,RMS是“ Ryan M. Schmidt”而不是“ Richard M. Stallman”。(自Stallman是GDB的原始作者以来的一个重要说明)
entropo 2011年

Windows已支持并排(msdn.microsoft.com/en-us/library/ms229072(v=vs.80).aspx)库加载约12年。因此,在版本控制方面您是相当错误的。
克劳斯·约根森

16

如果愿意strace,请不要忘记ltrace:相当于库调用。
另外,是的,我建议使用Linux From Scratch。在确定操作系统的核心元素以及它们如何组合在一起时,这是一个很好的练习。
要获得现代的,完整的系统编程参考资料,建议您选择Linux编程接口


12

Mac OS X就像是梅赛德斯(Mercedes)。它是最漂亮,最干净的,但价格昂贵。Windows就像丰田车;它会带你回到那里。

Linux就像一个热棒。这是人们深入挖掘并分解并重新组合在一起的方法。Linux不适用于只想使用计算机的人。适用于喜欢计算机的人。不爱电脑的人应该远离电脑。

您在Windows中学到的东西翻译得不是很好,不是。但是您可以看到内部零件并观察发动机的运转情况。

尝试将Linux当作一个新玩具,您可以将其玩耍并爬行,看看发生了什么。在Windows中容易完成的事情在Linux中难以实现。Windows中不可能发生的事情在Linux中是可能的。

如果您喜欢计算机,那么您可以喜欢Linux。如果您不喜欢计算机,那为什么还要编程呢?


13
+1,表示“ 在Windows中容易发生的事情在Linux中难;在Windows中不可能发生的事情在Linux中可能 ”。我要添加“ Windows会将预先消化的食物推入您的嘴里,而使用Linux则可以做饭,而这样做的好处是您可以吃到自己喜欢的食物 ” ...当然,无论它是否可食用很大程度上取决于您是多么出色的厨师...
Alain Pannetier 2011年

14
@Andy:“ Windows就像丰田车一样”。丰田的质量比Windows好得多。
恢复莫妮卡

4
@ SK-logic,准确地说。在不进行另一场宗教战争的情况下,请考虑以下因素。仅仅出于战略和财务方面的考虑,MS瞄准了尽可能多的受众。计算机意识的用户希望能够控制的技术内容被掩藏在视线之外,以使Joneses不会出现问题。最后,到处都是DEP,GPO,“受信任的安装程序”,私有或隐藏的API,“自修复启动”等繁琐的工作。极客们无法修复Windows,他们只是选择退出。Linux没有相同的霸权目标。这是由用户为用户完成的。这就是重点。
Alain Pannetier

3
@ SK-logic-“如果您有Windows资源” ... :-)
罗里(Rory Alsop)

3
“请记住一些“在Windows中是不可能的”和“在Linux中可能的”的名称-我在Linux系统脚本中发现了一个错误,并对其进行了修复。我在Windows中发现了一些错误,但从未能够修复它们。假设您在磁盘文件中有一个ISO(CD)映像;我可以在Linux中将其安装为驱动器;在Windows中可以做到吗?请记住,Linux中的几乎所有内容都是免费的,而Windows中的几乎所有内容都需要昂贵的专有应用程序。
安迪·坎菲尔德

9

您如何使用Monodevelop在Mono上进行开发?通过重用.NET的经验,可以使您轻松上手。


我最近尝试了这一点-与Visual Studio有所不同,但是我晚上起床了。这是一个很好的迁移途径。
JBR威尔金森

8

从一开始就看它会令人生畏(就像您是Linux开发人员一样,需要进行一些Windows开发)。我会一次解决这个问题。

  • 首先进行环境设置(编译器,IDE-是的,NetBeans / Eclipse等)。
  • 接下来,安装更高级别的api(boost / Qt等)
  • 慢慢开始,如果有迫在眉睫的问题需要解决,请编译代码(或从头开始编写等)。就像您要处理任何开发项目一样,首先获取您知道的工作内容(即不需要特定于OS的工作)互动),然后当您遇到障碍-搜索时,我确定那里的某个人之前遇到过相同的问题并已解决。

最重要的是,将所有主观意见留在门口。不,您不需要成为Linux开发的专家,我知道足够多,可以解决很多问题,但是我对此感到满意...


1
+1 Nim:StackExchange在这里有大量的先验信息。我对Unix风格最满意,但是当前在Windows开发环境中工作并且搜索SE在很短的时间内即可回答我的几乎所有查询。
罗里·阿尔索普

6

The success or failure of many thing in life comes down to our attitude, looking for positives and keeping your mind focused on the positives will do more to adide you as you start down this new interesting adventure.

您需要花费多长时间才能精通Windows环境。您可能会说,刚开始很容易。但是在那之前,您已经使用Windows了几年。在编写拳头程序之前,您已经使用Windows多长时间了。对我来说这是8年,尽管我现在几乎已经完全使用Linux 5年了。我现在比Windows更加精通Linux。您应该给自己的时间至少足够的时间来熟悉新系统。

首先从Windows不能使用的应用程序列表开始,然后在* nix世界中寻找替代方案。http://alternativeto.net/和Wikipedia的进一步阅读部分在此处可能会有所帮助。

这是一些可能非常有用的替代软件的列表。以下是您提到的内容的替代方法。

从一个系统迁移到另一个系统的其他有用资源

关于成为更好的高级用户或管理员用户,请查看以下资源

听起来自您研究* nix世界以来已经有一段时间了。我建议使用fedorasusedebian或我喜欢的工作站Ubuntu发行的一些新发行版。

现在,您可能不知道系统的内部知识,而不必了解Windows中的基础知识,就可以摆脱困境。我不仅会尝试摆脱最低限度的限制。如果您将Linux视为实际上可以帮助您进行开发的工具,而不是将其视为开发时所使用的操作系统,那么它将很有帮助。

如果您专门针对Linux进行开发,这是非常具体和技术性的,那么Linux From Scratch将变得更加重要。您要为内核开发的IE,或者将您的程序移植到运行Linux的超级计算机上。它将永远是非常有用的。我认为您可以尝试在Ubuntu上使用几个月的时间。Ubuntu将是尽可能接近的东西只是工作 Mac和Windows的世界。


1
Debian并非完全是新发行版。:-P虽然它仍然是一个不错的选择。
史蒂夫·S

SuSE和Fedora都不是... SuSE已有15岁了,Fedora确实是8岁的“年轻”发行版之一。不过,+ 1。
DarkDust 2011年

1
@Darkdust @ Steve-s如最新版本中的最新内容
nelaaro 2011年

6

我认为您在以下问题中回答了您的问题:

“在Windows上,您只需要了解一种编程语言,要针对其进行编码的API,您的IDE(VisualStudio)以及一些非常基本的故障排除工具(Depends,ProcessExplorer,DebugView,WinDbg)就可以摆脱。其他一切自然而然地出现。 ”

猜想一下,在Linux上,您只需要了解一种编程语言,一个API(或几个),您的IDE(Eclipse或NetBeans,甚至是Geany,Emacs或vim,如果愿意的话)以及一些基本的故障排除工具就可以摆脱困境( gdb,跟踪工具,棉绒,htop,ps)。

您在Windows编程生态系统中投入了大量知识。一旦希望掌握不同的工具,其中大部分就是(希望)抽象知识(是编译器,调试器,共享库,进程,线程?它们是做什么的?),这些知识很容易转换。有些是特定于领域的(将X添加到项目时会链接什么DLL?),但是即使在Windows中从一种语言过渡到另一种语言也需要一些新的知识。

在VM中安装Ubuntu或Fedora,在Eclipse或NetBeans教程中阅读一些C ++ Hello World,在Eclipse / NetBeans教程中阅读一些调试,让您的大脑自然的适应能力接管一切。如果您放松身心并付诸实践,它将为您转换想法。


3

我通常通过阅读手册页来学习Unix。您至少应该略过它们。是的,我的意思是所有人。我使用它的方法来CD到手册页目录,并一次攻击它们的一部分。

我用这个:

for i in *; do f=`basename $i .gz`; man `basename $f .1` ; done

...将.1替换为您正在阅读的部分的编号,.2,.3等。按ctrl-Z ctrl-C退出循环。如果您的Linux发行版存储的内容不同(即不是cmdname.1.gz),则里程数可能会有所不同。

只需仔细阅读说明,如果有意思的话,可以继续做。第1、2和3节对于程序员来说是最重要的。1涵盖了一般用户命令,其中包括您的编译工具和各种取证实用程序。2是系统调用,而3是库调用。


2
我建议将其启动xman为更“友好”的界面。选择一个部分,单击手册页,阅读它。冲洗,重复。
ΤΖΩΤΖΙΟΥ

我忘了这些事情。自由OS领域的文档状态不太理想,我发现这些工具通常会使情况变得更糟,因此我停止使用它们。我只能认为他们已经好一点了?
Hack Saw

3

不要强迫自己做自己不喜欢的事情。使用Windows作为开发环境,编写可移植的代码,针对Linux对其进行交叉编译,并且仅在VM中进行偶尔测试。


2

我不确定它是否适用于平台,但适用于编程语言,我发现思考一下自己对自己擅长的领域的熟悉和适应并尝试重播这些经验和活动对我有所帮助是有帮助的我试图学习。

也许在那些线上?

总的来说,我对GNU / Linux的兴趣和信心来自与Windows相比,它更具修补性(并且在早期需要修补)。我需要弄乱很多东西才能使它们工作,这帮助我学习了很多东西。现在情况好多了,但是所有这些小时都有所帮助。


2

我是两个任务相似但又不同的人之一。我在K-12校区工作,业务系统(人力资源,财务等)正在从HP3000 / TurboImage数据库迁移到Linux / MS SQL平台。我对MS SQL方面很满意。但不是Linux方面。我们两个人是在管理方面,而不是编程方面。编程是在外部完成的-K-12组织的第三方商业应用程序。

我在周末参加了一个为期5个周末的Linux(Redhat)入门课程-主要是在命令行模式下完成的-对于我来说,值得一时间快速入门Linux的工作方式。显然,YMMV取决于班级/教师。

您提到了“最糟糕的:如何配置Linux开发环境?”?由于您已经非常熟悉Windows,因此强烈建议您获得vmWare工作站的副本。这样一来,您就可以将Windows用作工作站,并可以将Linux安装为来宾系统-根据需要删除,冲洗和重复。当您获得良好的设置后,我相信您可以对其进行快照,但是我不能肯定地说哪些版本可以进行快照。而且,如果您进入vmWare Workstation路线以启用多个开发设置-肯定会增加内存。

我也不介意为来宾推荐使用CentOS作为Linux OS。据我了解,这就像RedHat,没有品牌和/或销售费用和/或支持费用。我不熟悉其他Linux风格,因此无法提供这些信息。

格雷格


1

我喜欢这两个平台,并且对于用户界面和开发生态系统方面的所有差异,我发现它们比类似的东西更有趣。实际上,对于大多数Windows概念,只需搜索Internet即可找到等效的Linux概念。

话虽如此,我强烈建议学习如何以“ Unix方式”做事。使用命令行而不是有问题的GUI前端(我在这里主要谈论的是gdb);不要寻找IDE,而是学习如何使用一组专用工具。选择一个好的编辑器(指向vim)并学习它。make即使您不打算成为专家,也请阅读工作原理。也许您甚至喜欢Linux。这是极客友好和有趣的玩。


1

考虑一下:您曾经对Windows一无所知,但是您了解了Windows,随着时间的流逝,它逐渐适应了Windows。

然后,MS将您喜欢的任何编程系统都更改为.NET,并且您不再对DLLS,COM以及任何东西一无所知,您必须学习诸如汇编,GAC,应用程序域之类的知识。你学得还行。

那么,为什么现在担心使用Linux进行相同操作呢?

Web上有很多针对各种编程环境的“入门”教程。现在您说的是GCC,所以我将开始C ++开发。让您自己使用Eclipse,在Eclipse平台之上安装CDT(c开发工具)(Eclipse是一个多用途IDE,您可以将其用于C ++,PHP,Java等任何东西-但您需要根据您的语言安装该工具因为您真的不希望像VS这样预先安装所有功能,并且需要3天的安装时间:))

网络上都有易于使用的教​​程。IBM这里有一个非常全面的产品。

调试工具... eclipse已嵌入(教程),但是您可以找到很多工具,例如您提到的工具,只需在网上搜索,您就会发现很多选择。您将需要一些时间来弄清楚如何读取核心转储(例如,与Windows userdump相对),但是您会到达那里。

也许还可以根据自己的经验来开办博客,这不仅会让您想起自己做过的事(例如,以自己喜欢的方式设置eclipse,还会忘记何时需要再次做某事)。一年的时间),但可以帮助您解决其他情况。


0

我认为您不需要从头开始使用Linux。如果我是你,我会选择Ubuntu。它更舒适,并且基于debian,有很多可用的技术材料。

如果您确实想更深入地了解Linux,那么Gentoo是一个不错的选择。它要求您阅读很多有关配置和内核的知识,但同时也为您提供了一个在af中工作的功能系统


0

谷歌“ Unix编程艺术”并阅读。海事组织,你的主要困难是不同的哲学,那本书非常适合作为阅读。

它还向您介绍了* n * x和Windows系统之间的一些非显而易见但在技术上非常重要的区别-这些是理解为什么以另一种方式在Linux上有意义的关键。


1
...并且还为您提供了许多可在Linux上使用的工具和技术。

0

我要问的第一个问题是您要开发什么?如果它是基于GUI的应用程序,则与必须编写类似内核扩展的内容可能有所不同。

对于gui应用程序,我发现最简单的方法是使用Qt,它具有自己的开发环境(Qt-Creator)并且是跨平台的,允许您仅学习一种可用于Windows / Linux的API。 / OSX甚至移动开发。就像Windows中的Visual Studio或OSX中的XCode一样,您可以通过图形编辑器创建和布局窗口和项目,并且可以很容易地从大量示例应用程序中获取API。

如果您需要获得更多的基础知识,那么一旦您在命令行上了解了Linux的使用方法,知道如何遍历目录,操纵文件,了解权限等之后,便可以开始阅读如何使用gcc编译简单程序,如何链接文件并运行可执行文件,然后如何使用gdb进行调试。

另外,如果这看起来有些令人生畏,则可以下载Eclipse或其他IDE,但是如果您首先将时间和精力放在命令行中,从长远来看,您可能会对Linux更加满意。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.