要从金山开源安全卫士的代码里学习,首先当然是最好能把全套代码编译出 来进行调试。在开发湘勇网络医生的过程中,我一直关注金山开源安全卫士代码的更新动态,第一时间把代码下载下来并进行编译和调试。现将金山开源安全卫士全 套代码的编译指南整理如下,方便各位关注金山开源安全卫士的朋友一起学习和交流。根据编译指南编译还有问题的,可在后面跟帖,我会测试和解决后整理进来。
一、编译准备工作
1、编译器 建议使用 Visual C++ 2005 或者 Visual C++ 2005 SP1
要想编译全套代码,请安装Visual C++ 2005或者Visual C++ 2005 SP1,其它版本的编译器因为金山开源安全卫士的部分库只释放了Visual C++ 2005编译的Release版本的lib而没有源代码,会导致链接有问题。详细的说,金山的kwslib和json库的代码是不开源的,不依赖这2个库的9个项目avcenter.sln、bkver.sln、commonlib.sln、kclear.sln、kmsspeed.sln、kprocesslib.lib、 lang.sln、PluginEngine.sln、SafeMon.sln是可以用Visual C++ 2008/2010来编译的,依赖这两个库的ksafe.sln、ksafeperfopt.sln、ksafesvc.sln、netmon.sln、 vlufix.sln是无法链接成功的。
2、Windows SDK建议使用WIN7 sdk
金山官方是使用的Windows SDK 6.1版本,经测试用7.0或者7.1版本也是可以编译通过的。下载WIN7 SDK的时候请注意一下,有不同平台共计3个版本的,请好好看说明,下载对应平台的版本。下错了没法安装(比如说WINXP x86下载了win7 sdk x64肯定是没法安装的)的话,得重下一个多G的文件。
集成Windows SDK到Visual Studio 2005请注意一下包含文件目录的顺序(据说WIN SDK 6.1不需要这样,未证实):
在可执行文件和包含文件选项里,把WIN7 SDK的相应目录放在最前面;
在引用库文件和库文件选项里,把WIN7 SDK的相应目录放在最下面;
3、源代码和库下载
请到 code.ijinshan.com 下载源代码和库文件,并将两个文件解压缩,把Lib4PCManager下面的所有目录和文件直接拷贝到解压缩的代码文件中的PCManager目录下去。
二、编译注意事项
1、参照前面的说明,金山只提供了金山开源安全卫士某些库的Visual C++ 2005编译的Release版本,因此必须在编译时选择编译Release版本才能无误,否则会出现链接错误。
2、先编译commonlib.sln工程,再编译其它工程。有些现实无法加载的项目,是因为这些项目的因不开源而删除,改编译其它项目即可。
3、Lang.sln实际上是拷贝百度OEM版本的金山安全卫士配置文件到编译输出目录,可不编译改项目。编译该项目后,运行开源金山安全卫士会显示是百度的版本。
三、运行的问题
2011年3月17日发布的代码中,Lang.sln配套的XML文件跟代码不符导致编译出来的程序会运行出错,不清楚后续是否修改好了。运行有问题的可自行调试或者在后面回复。
以上根据回忆撰写,可能跟实际稍后出入。发现问题的可跟帖反馈。本帖在 http://www.xanyong.com 有同步发布的版本,两边讨论均可。我会根据大家的反馈来持续完善和修订。 |
- 1
评分人数
-
|
|
|
|
|
|
|
2#
发表于 2011-4-12 17:11 | 只看该作者
看了lanlamer的指南,编译程序一马平川。。问题总于解决啦。。谢谢。。 |
|
|
|
|
|
|
|
3#
发表于 2011-4-15 14:17 | 只看该作者
回复 1# lanlamer
2、先编译commlib.sln工程,再编译其它工程。 commlib.sln没有找到呀,是否为commonlib.sln呢? |
|
|
|
|
|
|
|
4#
发表于 2011-4-15 14:34 | 只看该作者
回复 lanlamer
2、先编译commlib.sln工程,再编译其它工程。 commlib.sln没有找到呀,是否为common ... zy3710 发表于 2011-4-15 14:17
yes |
|
畢竟回憶是遠了暗了的暮靄,希望才是近了亮了的晨光。
|
|
|
|
|
|
5#
发表于 2011-12-12 15:03 | 只看该作者
我编译commonlib.sln 也报错呀
------ 已启动生成: 项目: BeikeUtils, 配置: Release Win32 ------ 正在执行预生成事件... 正在编译... ConditionEvaluate.cpp d:\tip\oss\pcmanager\src\publish\common/registrywow.h(18) : error C2146: 语法错误 : 缺少“;”(在标识符“OpenKeyEx”的前面) d:\tip\oss\pcmanager\src\publish\common/registrywow.h(18) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(19) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(19) : warning C4183: “OpenKeyEx”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(39) : error C2146: 语法错误 : 缺少“;”(在标识符“OpenKeyEx”的前面) d:\tip\oss\pcmanager\src\publish\common/registrywow.h(39) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(40) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(40) : warning C4183: “OpenKeyEx”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(114) : error C2146: 语法错误 : 缺少“;”(在标识符“GetValue”的前面) d:\tip\oss\pcmanager\src\publish\common/registrywow.h(314): 参见对正在编译的类 模板 实例化“CRegistryWow<T>”的引用 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(114) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(115) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(124) : warning C4183: “GetValue”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(126) : error C2146: 语法错误 : 缺少“;”(在标识符“SetValue”的前面) d:\tip\oss\pcmanager\src\publish\common/registrywow.h(126) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(127) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(136) : warning C4183: “SetValue”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(138) : error C2146: 语法错误 : 缺少“;”(在标识符“DeleteValue”的前面) d:\tip\oss\pcmanager\src\publish\common/registrywow.h(138) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(139) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(148) : warning C4183: “DeleteValue”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(61) : error C3861: “Wow64DisableWow64FsRedirection”: 找不到标识符 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(65) : error C3861: “Wow64RevertWow64FsRedirection”: 找不到标识符 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(114) : error C2146: 语法错误 : 缺少“;”(在标识符“GetValue”的前面) .\ConditionEvaluate.cpp(97): 参见对正在编译的类 模板 实例化“CRegistryWow<T>”的引用 with [ T=2 ] d:\tip\oss\pcmanager\src\publish\common/registrywow.h(114) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(115) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(115) : warning C4183: “GetValue”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(126) : error C2146: 语法错误 : 缺少“;”(在标识符“SetValue”的前面) d:\tip\oss\pcmanager\src\publish\common/registrywow.h(126) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(127) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(127) : warning C4183: “SetValue”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(138) : error C2146: 语法错误 : 缺少“;”(在标识符“DeleteValue”的前面) d:\tip\oss\pcmanager\src\publish\common/registrywow.h(138) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(139) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(139) : warning C4183: “DeleteValue”: 缺少返回类型;假定为返回“int”的成员函数 .\ConditionEvaluate.cpp(507) : warning C4800: “BOOL”: 将值强制为布尔值“true”或“false”(性能警告) BeikeUtils.cpp d:\tip\oss\pcmanager\src\publish\common/registrywow.h(18) : error C2146: 语法错误 : 缺少“;”(在标识符“OpenKeyEx”的前面) d:\tip\oss\pcmanager\src\publish\common/registrywow.h(18) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(19) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(19) : warning C4183: “OpenKeyEx”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(39) : error C2146: 语法错误 : 缺少“;”(在标识符“OpenKeyEx”的前面) d:\tip\oss\pcmanager\src\publish\common/registrywow.h(39) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(40) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(40) : warning C4183: “OpenKeyEx”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(114) : error C2146: 语法错误 : 缺少“;”(在标识符“GetValue”的前面) d:\tip\oss\pcmanager\src\publish\common/registrywow.h(314): 参见对正在编译的类 模板 实例化“CRegistryWow<T>”的引用 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(114) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(115) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(124) : warning C4183: “GetValue”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(126) : error C2146: 语法错误 : 缺少“;”(在标识符“SetValue”的前面) d:\tip\oss\pcmanager\src\publish\common/registrywow.h(126) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(127) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(136) : warning C4183: “SetValue”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(138) : error C2146: 语法错误 : 缺少“;”(在标识符“DeleteValue”的前面) d:\tip\oss\pcmanager\src\publish\common/registrywow.h(139) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\tip\oss\pcmanager\src\publish\common/registrywow.h(148) : warning C4183: “DeleteValue”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(114) : error C2146: 语法错误 : 缺少“;”(在标识符“GetValue”的前面) .\BeikeUtils.cpp(479): 参见对正在编译的类 模板 实例化“CRegistryWow<T>”的引用 with [ T=2 ]
d:\tip\oss\pcmanager\src\publish\common/registrywow.h(127) : warning C4183: “SetValue”: 缺少返回类型;假定为返回“int”的成员函数 d:\tip\oss\pcmanager\src\publish\common/registrywow.h(139) : warning C4183: “DeleteValue”: 缺少返回类型;假定为返回“int”的成员函数 生成日志保存在“file://d:\tip\oss\pcmanager\src\src_commonlib\BeikeUtils\Release\BuildLog.htm” BeikeUtils - 52 个错误,17 个警告 ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ========== |
|
|
|
|
|
|
来源:https://www.cnblogs.com/liuweijian/archive/2012/01/16/2323364.html