您的位置:首页 > 其它

Win32平台下基于SVN开发的若干问题整

2011-12-16 11:27 113 查看
 SVN(SubVersion)是目前开源的版本管理工具中较为流行的,最新的release是1.6.1。但是遗憾的是基于SVN开发的资料在互联网上异常的少。

 

         最近一段时间,我在工作上需要编写一个使用SVN进行版本管理的编辑器。(需要对编辑器生成的文件做版本管理以利于多人合作开发)起初是通过调用svn自身携带的的客户端程序svn.exe以实现相关功能,然而由于实际中的若干设计问题,最终的速度很不理想。于是产生了借用svn自身提供的api接口实现所需功能的想法。

 

         在实际使用svn提供的api时遇到了一些问题,经过多番查找资料以及尝试最终得以解决。将问题整理在此,以方便日后与我遇到类似问题的朋友。

 

         Svn提供的第三方开发接口sdk可以在这里下载到。目前最新的release是1.6.1。我在项目中实际使用的版本是1.5.6。开发需要的几个压缩包分别如下: 游戏编程
2009FLY文摘,正正博客 WWW.2009FLY.COM

Svn发布的2进制可运行文件,包括客户端与服务端,以及所需的dll:

http://subversion.tigris.org/files/documents/15/45230/svn-win32-1.5.6.zip

Svn开发所需的lib及头文件以及文档:

http://subversion.tigris.org/files/documents/15/45236/svn-win32-1.5.6_dev.zip

Svn的调试符号文件: 网络安全 2009FLY文摘,正正博客 WWW.2009FLY.COM

http://subversion.tigris.org/files/documents/15/45234/svn-win32-1.5.6_pdb.zip 2009FLY文摘,正正博客
WWW.2009FLY.COM

 

此外,在编写基于SVN的程序时,在链接时还有一些必要的库需要添加,分别是: 2009FLY文摘,正正博客 WWW.2009FLY.COM

Berkeley DB for Windows:

http://subversion.tigris.org/files/documents/15/32472/db-4.4.20-win32.zip

libintl binaries for Windows:

http://subversion.tigris.org/files/documents/15/20739/svn-win32-libintl.zip 内容来自www.2009fly.com
2009FLY文摘,正正博客 WWW.2009FLY.COM

 

有了这几个包,就可以使用SVN提供的api开发基于SVN的第三方软件了。

 

         基于SVN1.5及之后的版本开发的时候,会遇到一个CRT冲突的问题,该问题会导致在调用svn_cmdline_init时,如果在error stream参数中传入非NULL值,则会直接crash。一个针对该问题的描述可以参见这里

         我下载了调试符号以及源代码之后,跟踪调试到svn_cmdline_init函数当中,发现crash发生在一个CRT函数(setvbuf)的调用当中。实际跟踪调试的过程中发现,虽然该函数是crt中的函数,然而vc调试器却无法基于本地的调试符号正确跟踪到其源文件当中。

又该问题在1.4及之前的版本不存在。究其原因,我猜测可能是由于自1.5版本之后,SVN提供的库是基于动态链接的CRT库的。而svn本身的lib在编译时链接的crt与客户的VC6的CRT版本不符导致的。(1.4版本之前则是静态链接的CRT)

对该问题的描述还可以参见这里

  copyright 2009fly 2009FLY文摘,正正博客 WWW.2009FLY.COM

The problem is stderr — it is a FILE* which is a CRT type which means 

you have to be using the same CRT as the dll’s were built with. 

Unfortunately, there are a few API’s where raw CRT types crept in that 

aren’t wrapped by APR.  移动开发,Android、iPhone
2009FLY文摘,正正博客 WWW.2009FLY.COM

You can either avoid those API’s, rebuild Subversion with your 

compiler, or link to the static libraries instead of the dynamic 

libraries and use the no-default-libs option to make sure that your 

CRT is linked in instead of the VC6 one (I believe this is how it 
worked prior to 1.5). 

DJ 

 

解决该问题的方法之一是自行编译svn的全部源码,而不使用官方提供的dev包。然而svn的源码编译要求的环境异常复杂(需要配置非常多的环境项:包括cygwin,python等等)。更简单的解决方案是使用静态链接版本的svn库。

svn_cmdline_init位于libsvn_subr-1.lib当中。该版本的lib在1.5及以后的版本开发包中是动态库,实际运行时需要libsvn_subr-1.dll的支持。同在该开发包中发布的还有一个静态版本的该库,名为svn_subr-1.lib。

但是链接静态版本的svn_subr-1.lib时,由于其中静态链接了CRT库,因此VC自带的libcmt.lib/libcmtd.lib会与之冲突。实际链接时会报出一堆同一个符号被多次链接的错误,只需将VC自带的libcmt.lib/libcmtd.lib设置忽略即可。

原文:http://www.windameister.org/blog/2009/05/15/win32-svn-dev-some-notes/ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐