使用Visual Studio为Unix的C ++开发
有没有人想分享有关使用Visual Studio开发Unix应用程序的战斗故事?而且,我并不是说将.NET与运行在其下的Mono或者Wine虚拟平台一起使用。
我们公司大约有20位开发人员,他们全部运行Windows XP / Vista,并且主要针对Linux和Solaris进行开发。直到最近,我们所有人都以老式的良好方式登录到主要的Linux服务器并修改/构建了代码:Emacs,Vi和dtpad任我们选择。然后有人说:"嘿,我们生活在黑暗时代,我们应该使用IDE"。
因此,我们尝试了一些,并确定Visual Studio是满足我们性能需求的唯一工具(是的,我确定IDE X是非常好的IDE,但我们选择了VS)。
问题是,如何设置环境以使VS可以在本地使用这些文件,而生成服务器也可以使用这些文件?我们决定编写一个Visual Studio插件,每当我们单击"保存"时,它将文件本地写入到构建服务器中,并且有一个胖"同步"按钮,当我们在服务器端更改文件时,我们可以按下该按钮(例如,从我们的源代码控制服务器更新到最新文件)。
该插件还使用Visual Studio的外部构建系统功能,该功能最终仅ssh进入构建服务器并调用我们本地的" make"实用程序(Boost Build v2具有很好的依赖性检查,但启动起来确实很慢,即30-60秒)。结果将通过管道传输回Visual Studio,以便开发人员可以单击错误并转到相应的代码行(实际上很流畅)。构建服务器使用GCC并交叉编译我们所有的Solaris构建。
但是,即使在完成所有这些操作之后,每当我开始在Visual Studio中编写代码时,我都禁不住叹息。我单击一个文件,开始输入内容,然后VS突突来跟上我。
除了停止并等待工具之外,还有什么比这更令人讨厌的了?这些好处值得沮丧吗?
有想法,故事,帮助吗?
解决方案
回答
哇,这听起来像是Visual Studio的一个很奇怪的用法。我很高兴能脱离vim。但是,我最喜欢Visual Studio的一件事是调试器。听起来我们甚至没有使用它。
当我打开问题时,我认为我们必须指的是在Visual Studio中开发可移植应用程序,然后将它们迁移到Solaris。我已经做到了,并且有愉快的经历。
回答
我感到你很痛苦。我们有一个"跨平台"的应用程序。一个典型的客户端/服务器应用程序,其中客户端需要能够在Windows和Linux上运行。由于我们的客户群主要使用Windows,因此我们使用VS2008(调试器使工作变得容易得多),但是我们仍然需要执行linux构建。
这样做的主要问题是,我们正在检入我们不知道将在gcc下构建的代码,这很可能会破坏我们已设置的CI内容。因此,我们在所有开发人员的计算机上都安装了MingGW,这使我们能够在将工作副本提交回存储库之前测试它是否将在gcc下构建。
回答
我们正在使用与我们所描述类似的解决方案。
我们将代码存储在世界的Windows一侧,并且UNIX(确切地说是QNX 4.25)可以通过NFS挂载进行访问(这要感谢Windows的UNIX服务)。我们有一个到UNIX的ssh来运行make,而有一个管道则可以输出到VS。访问代码的速度很快,构建速度比以前慢了一点,但是目前最长的编译时间不到两分钟,没什么大不了的。
使用VS进行UNIX开发值得我们付出努力,因为我们现在有了IntelliSense。更少的输入=快乐的开发人员。
回答
网络共享。
当然,网络上存在致命的延迟,但是至少只有一个文件副本。
我们不想听到我在两个平台上进行开发时所做的事情。但是,我们将要进行以下操作:每天几次拖放复制。本地构建和运行,并定期在Unix上进行检查,以确保gcc满意,并且单元测试在该平台上也满意。那里并不是一个快速的周转周期。
回答
@monjardin
我们使用它的主要原因是因为Visual Assist X(Whole Tomato)提供了重构/搜索工具。尽管还有其他许多不错的东西,例如Intelli-sense。我们还正在研究与其他工具AccuRev,Bugzilla和Totalview的集成,以完善环境。
@roo
使用多个编译器听起来很痛苦。我们拥有对所有平台坚持使用gcc的奢侈待遇。
@乔什
kes!这听起来像是引入错误的好方法! :-)
回答
VS突突赶上我。
嗯...机器需要更多的内存和咕unt声。我从未遇到过性能问题。
我有大约十年的经验,完全按照建议进行工作,其中大部分是在金融行业中,为银行,证券交易所,证券经纪市场的客户开发实时系统。
在继续进行之前,我必须承认所有这些都是在VS6 + CVS和最近的SVN中完成的。
源代码版本控制
开发人员具有单独的SourceSafe存储库,以便他们可以存储自己的工作并按逻辑里程碑对其进行检查。当他们感觉要进行集成测试时,我们运行一个脚本将其检入SVN。
一旦签入SVN,我们将启动一个过程,该过程将自动生成相关的makefile,以将其编译到目标计算机上以进行持续集成。
我们还有另一组脚本,可将SVN中的新内容同步到VS所管理的文件夹中。由于VS无法自动提取新文件,因此存在一些差距。我们通常是手动处理。这仅在项目的前几天定期发生。
这是我们如何维护代码的概述。我不得不说,我可能已经掩盖了一些细节(如果我们有兴趣,请告诉我)。
编码
从编码方面来看,我们在很大程度上依赖于预处理文件(即#define等)和makefile中的标志来影响编译过程。为了实现跨平台的可移植性,我们使用GCC。几次,我们被迫在HP-UX和其他一些编译器上使用aCC,但我们对此并不感到悲伤。唯一一直困扰着我们的事情是,我们必须注意跨平台的线程堆空间。编译器不会因此而幸免。
为什么?
通常的问题是,"为什么还要花这么多钱才能拥有如此复杂的发展方式?"。我们的答案通常是另一个问题,"我们有任何线索通过检查核心转储或者使用gdb调试多线程应用程序有多么疯狂吗?"。基本上,当我们调试一个不起眼的错误时,我们可以跟踪/逐步执行每一行代码,这一切都值得我们付出努力!
加上!... VS的智能感知功能使查找属于类的方法/属性变得如此容易。我还听说VS2008具有重构功能。我已经将重点转移到同时具有这两个功能的Eclipse上的Java上。我们会更加有效率地专注于编码业务逻辑,而不是全神贯注地使自己的想法像记住一样!
还! ...我们最终将获得可以在Windows和Linux上运行的产品!
祝你好运!
回答
我们为Mac和PC开发。我们只是在本地工作,无论我们喜欢什么,主要是VS,还有xcode。当我们认为更改对于构建服务器足够稳定时,我们将其检入。两个构建服务器(Mac和PC)寻找源代码控制签入,每个都进行构建。构建错误将通过电子邮件发送回团队。
在构建服务器上实时编辑文件对我来说似乎是不稳定的。如果我们在另一个开发人员进行无法构建的编辑时请求构建,会发生什么情况?
回答
我知道这并不能真正回答问题,但是我们可能需要考虑设置远程X会话,并运行诸如KDevelop之类的东西,顺便说一句,它是一个非常不错的IDE,或者甚至是Eclipse,它都可以主流,并且拥有更广泛的开发人员基础。我们可能只使用Xming之类的东西作为Windows计算机上的X服务器。
回答
我在Visual Studio中开发Playstation2代码方面有丰富的经验
在Cygwin中使用gcc。如果我们有使用gcc和glibc的cygwin,它
应该与目标环境几乎相同。你的事实
必须在Solaris和Linux上可移植,这暗示cygwin应该
工作很好。
回答
我大部分的编程经验是在Windows上,而且我是Visual Studio的忠实拥护者(尤其是使用Resharper的话,如果我们碰巧正在进行C编码)。这些天来,我一直在用C ++编写针对Linux的应用程序。在尝试了所有的IDE(Netbeans,KDevelop,Eclipse CDT等)之后,我发现Netbeans最少。对我而言,绝对的最低要求是我能够单步执行代码并且具有智能,并且还具有一些理想的重构功能。令我惊讶的是,当今的Linux IDE甚至还不及十年前的Visual Studio 6. 当前最大的痛点是Netbeans中智能感知的执行速度和速度。在具有8GB RAM的快速计算机上进行填充需要2-3秒。 Eclipse CDT的智能感知甚至更慢。对不起,但是等待2秒钟的智能感知并不能解决问题。
所以现在我正在考虑从Windows使用VS,即使我唯一的构建目标是linux ...
克里斯,我们可能想看看免费的自动化构建服务器" CruiseControl",该服务器与所有主要的源代码控制系统(svn,tfs,sourcesafe等)集成。整个目的是对源代码控制系统中的签入做出反应。通常,我们对其进行配置,以便任何人只要签入代码,就可以启动构建并(理想情况下)运行单元测试。对于某些语言,有一些很棒的插件可以进行代码分析,衡量单元测试代码的覆盖率等。有关成功/失败构建的通知会发送给团队。
这是一篇描述如何为C ++设置的文章:链接(thoughtworks.org)。
我刚刚开始从仅基于Linux的简单配置(Netbeans + SVN,无构建自动化)转换为使用Windows VS 2008和具有运行单元测试的构建自动化后端,以及在Linux中进行构建。我花了很多时间来配置所有功能,但我感到不安,但我猜越早越好。
在理想的最终状态下,我将能够从VS项目自动生成Netbeans项目文件,这样,当我需要在linux中调试某些东西时,可以从该IDE中进行调试。 VS项目文件是基于XML的,因此不要太难。
如果有人对此有任何建议,我将不胜感激。
谢谢,
克里斯多夫(Christophe)
回答
我们可以让开发人员在私有分支机构中工作(如果使用DVCS则更容易)。然后,当我们想检入某些代码时,将其检入[windows | unix]上的私有分支,在[unix | windows]上更新沙盒并进行构建/测试,然后再提交回主分支。
回答
签出"最终生成器"(http://www.finalbuilder.com/)。选择一个版本控制系统(例如cvs或者svn,老实说,cvs听起来更适合此特定用例),然后在FinalBuilder上设置构建触发器,以便签入引起编译并将结果发送回给我们。
我们可以在FinalBuilder中设置规则集,以防止我们将损坏的代码签入/合并到基线或者某些分支文件夹中,但允许其他人使用(我们不允许对/ baseline或者/ branches / *的损坏的提交,但我们有/ wip /分支文件夹,供需要共享可能损坏的代码或者仅希望在一天结束时提交的开发人员使用。
我们可以将FB分布在多个"构建服务器"上,这样就不会有20个人试图在一个框上进行构建,或者等待一个框来处理所有小的提交。
我们的项目有一个带有Mac和Win客户端的基于Linux的服务器,它们共享一个共同的代码库。这样的设置对我们来说非常可笑。