Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2206|回复: 5
打印 上一主题 下一主题

360 9.1的源码

[复制链接]

1272

主题

2067

帖子

7958

积分

认证用户组

Rank: 5Rank: 5

积分
7958
跳转到指定楼层
楼主
发表于 2020-3-24 23:03:40 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
http://www.qtcn.org/bbs/read-htm-tid-57858.html
原作者:http://bbs.csdn.net/topics/390508293

原作者的版本我下载了,无法运行,因为我的是qt5.3.2 mingw

然后我给  每个类一个目录, 让它支持qt5.3.2 ,删除了多语言支持,因为我个人不需要翻译功能,只需要中文即可


mingw qt5.3.2 可运行  我也不知道是不是所有功能都正常

截图如下:





360Safe.zip (2433 K) 下载次数:1400

回复

使用道具 举报

1272

主题

2067

帖子

7958

积分

认证用户组

Rank: 5Rank: 5

积分
7958
6#
 楼主| 发表于 2020-3-25 22:43:16 | 只看该作者
错误        1        error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1600”(about_us.obj 中)        F:\github\TODO\360safe92\qtmaind.lib(qtmain_win.obj)


项目原本的平台工具集设置为V120,修改为v110后发生错误:错误 146 error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1700”(AssemblyInfo.obj 中) CefSharp\CefSharp.Core\libcef_dll_wrapper.lib(libcef_dll_wrapper.obj) CefSharp.Core
_MSC_VER是微软公司推出的C/C++编译器在ANSI/ISO C99标准之外扩展的宏定义,用来定义当前微软公司自己的编译器的主版本。需要注意的是,这并不是Visual Studio 的版本号。下面是一些编译器版本的_MSC_VER值
MS VC++ 12.0 _MSC_VER = 1800 (Visual C++ 2013)
MS VC++ 11.0 _MSC_VER = 1700 (Visual C++ 2012)
MS VC++ 10.0 _MSC_VER = 1600(Visual C++ 2010)
MS VC++ 9.0 _MSC_VER = 1500
MS VC++ 8.0 _MSC_VER = 1400
MS VC++ 7.1 _MSC_VER = 1310
MS VC++ 7.0 _MSC_VER = 1300
MS VC++ 6.0 _MSC_VER = 1200
MS VC++ 5.0 _MSC_VER = 1100
原项目是VS2013编译的,所以不能修改为v110



好像是在stdfx.h  文件中
修改_MSC_VER 的值
你新创建一个工程,比较一下stdfx.h  看值怎么设置???







一、引言
最近在编译运行有关 cef 的项目的时候,发现总会出现这样的编译问题:


libcef_dll_wrapper13d.lib(process_message_ctocpp.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1900”(HTMLEventHandler.obj 中)


这里,我要编译的项目的原来的编译平台是 Visual Studio 2013(即宏 _MSC_VER = 1800),而我正在使用的 IDE 是 Visual Studio 2017(即宏 _MSC_VER = 1900),出错信息很明确的指出了,当前的编译平台工具集并不匹配。


为什么这里不能兼容呢? Visual Studio 难道没有做到向下兼容吗?


于是我又尝试了下 Visual Studio 2010,结果也不能通过编译。


这下这就是一个有趣的问题了。


二、认识 _MSC_VER
想要探讨这个问题,首先要明白宏 _MSC_VER 的意义是什么:


_MSC_VER 是微软公司推出的 C/C++ 编译器在 ANSI/ISO C99 标准之外i扩展的宏定义,用来定义当前微软公司自己的编译器的主版本。需要注意的是,这并不是 Visual Studio 的版本号,也不是 Visual C++ 的版本号。


至于每个 Visual Studio 对应了值为多少的 _MSC_VER,可以查看这个网址:


_MSC_VER


现在,我们了解到了,宏 _MSC_VER 表明了当前项目的编译器的主版本。


那么为什么不能兼容呢?


三、StackOverflow
这个问题最终在 StackOverflow 上找到了解释:


You are trying to link objects compiled by different versions of the compiler. That’s not supported in modern versions of VS, at least not if you are using the C++ standard library. Different versions of the standard library are binary incompatible and so you need all the inputs to the linker to be compiled with the same version. Make sure you re-compile all the objects that are to be linked.


The compiler error names the objects involved so the information the question already has the answer you are looking for. Specifically it seems that the static library that you are linking needs to be re-compiled.


这位大神已经说的很清楚了,我尽量翻译下:


你在尝试着将编译自不同版本编译器的对象链接起来。在现代版本的 VS 中这是不被支持的,至少在你使用了 C++ 标准库之后就不支持了。不同版本的标准库之间是二进制不兼容的,因此你需要使用统一版本的编译器来编译其所有的输入文件。请你需要链接的对象都全部重新编译了。


编译错误提示此对象陷入了上述的问题。如果想要解决这个问题你需要重新编译所需要的静态链接库。


也就是说,在编译过程中,我将经由 Visual Studio 2013 的编译器编译出来的静态链接库文件 libcef_dll_wrapper13d.lib 放到了当前的 Visual Studio 2017 的编译器中与当前项目一起编译,故然出错。


四、解决方案
经过上述的探讨,总结解决方案有如下两个:


找指示编译器对应的编译平台进行编译:比如这里 _MSC_VER 为 1800,对应了 Visual Studio 2013,这是将当前项目与静态链接库的编译器版本进行统一的方法


使用你当前使用的 VS 对应的编译器重新编译出错的静态链接库:比如这里我只需要重新编译 libcef_dll_wrapper13d.lib(使用 VS2017 的编译器)即可


问题终于解决,网上大部分的博客都是告诉我们怎么做,而不告诉我们为什么,这是对我们对于程序的理解是不好的。


点赞 6
————————————————
版权声明:本文为CSDN博主「曾经去过跨越一个小时的地方」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012814856/article/details/76343540


编译器[url=]编辑[/url]
_MSC_VER 定义编译器的版本。下面是一些编译器版本的_MSC_VER值(参见扩展阅读中的参考文献2的链接)
MS VC++ 15.0 _MSC_VER = 1910 (Visual Studio 2017)
MS VC++ 14.0 _MSC_VER = 1900 (Visual Studio 2015)
MS VC++ 12.0 _MSC_VER = 1800 (VisualStudio 2013)
MS VC++ 11.0 _MSC_VER = 1700 (VisualStudio 2012)
MS VC++ 10.0 _MSC_VER = 1600(VisualStudio 2010)
MS VC++ 9.0 _MSC_VER = 1500(VisualStudio 2008)
MS VC++ 8.0 _MSC_VER = 1400(VisualStudio 2005)
MS VC++ 7.1 _MSC_VER = 1310(VisualStudio 2003)
MS VC++ 7.0 _MSC_VER = 1300(VisualStudio .NET)
MS VC++ 6.0 _MSC_VER = 1200(VisualStudio 98)
MS VC++ 5.0 _MSC_VER = 1100(VisualStudio 97)
其中MS VC++ 14.0表示Visual C++的版本为14.0,后面括号中的Visual Studio 2015,表明该VC++包含在微软开发工具Visual Studio 2015中。
另外,可以通过当前使用的MS VC++编译器的版本信息来推断当前编译器预定义的 _MSC_VER 值。_MSC_VER 的值是由 MS VC++编译器的主版本号和次版本号构成的,其中主版本号是以“.”分割的版本号信息中的第一部分,而次版本号为其中的第二部分。例如,假设当前那使用的Visual C ++编译器的版本号是15.00.20706.01(MS VC++ 2008),那么其主版本号就是为“15”,而次版本号就是为“00”,因此当前编译器预定义的 _MSC_VER 宏的值就为1500。
关于编译器版本号的查看,需要说明的是:这里的版本号并不是指在“Microsoft Visual Studio——Help——About”里的“Version”的值,这个版本号是指Visual Studio的版本号,而不是VC++编译器的版本号,VC++编译器在Visual Studio里面是指“cl.exe”程序,该程序才是编译C++代码的真正编译器,如查看“cl.exe”的版本号,以在WIndows 7查看VC 2005的“cl.exe”的版本号为例,“开始——所有程序——Microsoft Visual Studio 2005——Visual Studio Tools——Visual Studio 2005 Command Prompt”进入VC++ 2005命令行,运行“cl /?”,将会看到如下的信息:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
vc++ command line
cl.exe version

其中的“14.00.50727.762”就是版本号,对应的的_MSC_VER的值就是1400(14.00.50727.762的四部分依次为:主版本号、次版本号、生成版本号和修订号,其中还有两个相关宏_MSC_FULL_VER:值为140050727,_MSC_BUILD:值为762)。

编译程序[url=]编辑[/url]
在程序中加入_MSC_VER宏可以根据编译器版本让编译器选择性地编译一段程序。例如一个版本编译器产生的lib文件可能不能被另一个版本的编译器调用,那么在开发应用程序的时候,在该程序的lib调用库中放入多个版本编译器产生的lib文件。在程序中加入_MSC_VER宏,编译器就能够在调用的时根据其版本自动选择可以链接的lib库版本,如下所示。
#if _MSC_VER >= 1400 // for vc8, or vc9
#ifdef _DEBUG
#pragma comment( lib, "SomeLib-vc8-d.lib" )
#elif
#pragma comment( lib, "SomeLib-vc8-r.lib" )
#endif
#elif _MSC_VER >= 1310 // for vc71
#ifdef _DEBUG
#pragma comment( lib, "SomeLib-vc71-d.lib" )
#elif
#pragma comment( lib, "SomeLib-vc71-r.lib" )
#endif
#elif _MSC_VER >=1200 // for vc6
#ifdef _DEBUG
#pragma comment( lib, "SomeLib-vc6-d.lib" )
#elif
#pragma comment( lib, "SomeLib-vc6-r.lib" )
#endif
#endif


回复 支持 反对

使用道具 举报

1272

主题

2067

帖子

7958

积分

认证用户组

Rank: 5Rank: 5

积分
7958
5#
 楼主| 发表于 2020-3-25 20:02:15 | 只看该作者
本帖最后由 Qter 于 2020-3-25 22:22 编辑

严重性        代码        说明        项目        文件        行        禁止显示状态
错误        LNK2019        无法解析的外部符号 _gethostname@8,该符号在函数 "public: static class QString __cdecl QSysInfo::machineHostName(void)" (?machineHostName@QSysInfo@@SA?AVQString@@XZ) 中被引用        360safe        F:\github\temp\360safe\Qt5Cored.lib(qglobal.obj)        1        


Qt5.11.2 & VS2017 & 64位版本 静态编译
1、问题描述:
小伙伴们有没有也遇到过,自己使用Qt库开发的小程序,在自己电脑上跑得很欢快。
但当想要把编译好的.exe可执行文件发给朋友玩玩的时候,发现在没有安装Qt或者VS环境的电脑上是跑不了的。
究其原因,这是因为大家在编译程序时,大多使用的是动态编译。
简单来讲,就是编译好的程序在运行时另外还需要加上一堆的dll库文件,否则运行就会报错。
如果想将生成的程序连同所需要的依赖库一起完整地打包成一个.exe可执行程序,那就需要使用静态编译的方式。

然而,当使用VS编译Qt程序时,运行库选择多线程(/MT)(表示采用多线程静态链接库的方式)进行编译时,
发现编译是不能通过的。会有如下的错误提示:

Qqtmain.lib(qtmain_win.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MT_StaticRelease”

原因在于安装Qt时默认使用的是动态库(而我们却用静态库的方式编译,明显是不对的)。
如果想使用静态库编译,可以自己将Qt源码下载下来,自己动手重新编译,生成静态库。
这样以后也就只需要一个exe,就能随处运行了哈~

2、下载源码包
首先,我们需要从Qt官网(地址:http://download.qt.io/archive/qt/5.11/5.11.2/single/ )下载对应的Qt源码。在这里,我以在Windows下编译Qt程序为例。

下载后是一个压缩文件,将它解压到一个空间较大的磁盘下面。一会静态编译需要占用大量磁盘空间。(谨慎起见,请至少保证该磁盘下有10G左右空间。)


3、编译环境
以下是编译时需要的工具,在编译之前,请务必安装!
安装都比较简单。这里直接贴出官网下载的链接。最后记得添加到环境变量(其实只要安装时把"添加到PATH环境"选项勾起就可以了)。

Ruby version 1.9.3 or later
Perl version 5.12 or later
Python version 2.7.5 or later
JOM
建议安装jom,来替换nmake进行编译,可以充分利用CPU多核的能力,否则估计你会中途吐血的。
jom是nmake的多线程版,nmake不支持多线程(编译速度快很多)。

4、编译源码库
以上东西都准备好以后,接下来我们可以开始编译源码了。

在编译之前记得先将所有的杀毒软件关掉(避免误杀)。

然后进入解压后的Qt源码文件夹下的qtbase/mkspecs下,找到win32-msvc文件夹。

进入选中的文件夹之后,找到qmake.conf文件并使用文本编辑器打开。

我们再根据它include的内容定位到相应的文件。

include(../common/msvc-desktop.conf)
1
找到相应的文件后,修改其内容。在这里也就是msvc-desktop.conf这个文件。

找到以下标志。将原来的:

QMAKE_CFLAGS_RELEASE    = $$QMAKE_CFLAGS_OPTIMIZE -MD
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MD
QMAKE_CFLAGS_DEBUG      = -Zi -MDd

修改成:

QMAKE_CFLAGS_RELEASE    = $$QMAKE_CFLAGS_OPTIMIZE -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MT
QMAKE_CFLAGS_DEBUG      = -Zi -MTd

即将MD改成MT,MDd改成MTd。

在开始菜单中,找到“适用于 VS 2017 的 x64 本机工具命令提示“ 或者 “x64 Native Tools Command Prompt for VS 2017”。


将当前目录切换到源码解压后的目录下。比如我的是在E盘下的qt-everywhere-src-5.11.2这个文件夹。


接下来,将执行关键的几个命令。首先执行configure命令。复制并执行以下命令:

configure.bat -mp -confirm-license -opensource -platform win32-msvc -debug-and-release -static -force-asserts -prefix E:\Qt5.11.2\Qt-msvc2017-x64-static -static-runtime -silent -opengl desktop -qt-sqlite -qt-pcre -qt-zlib -qt-freetype -qt-harfbuzz -qt-libpng -qt-libjpeg -nomake examples -nomake tests

· -platform选项设置主机平台和用于构建Qt源码的编译器(对于Windows机器,可以使用MinGW或Visual Studio工具链来编译Qt)

configure.bat -platform win32-g++
configure.bat -platform win32-msvc

· -static 选项表示编译静态库;
. -debug-and-release 当然如果你只需要release版本,此选项可以改成"-release"
· -prefix 该选项是用于指定编译完后的安装目录,此目录不需要事先创建,建议路径不要太长。
. -qt 指定编译一些第三方库。
这个过程不需要很久,执行完结果如图:


执行jom命令。(这时候可以先去喝杯咖啡或者做做其他事情~~ )

jom执行完毕之后,最后再输入jom install安装。 如果没有意外,那么我们就会在之前设定好的路径下看到编译好的文件。

至此,整个Qt源码编译过程也就结束了(过程说简单也简单,但我却搞了两三天,就因为前面环境没搭好)
但别高兴得太早,这还没结束呢。。我们必须得建立一个测试程序运行起来才算成功!

4、安装和配置
VS2017中Qt插件安装教程

点击菜单栏上的“Qt VS Tools > Qt Options”打开Qt选项窗口;


然后将我们编译好的Qt版本(E:\Qt5.11.2\Qt-msvc2017-x64-static)添加进来。


我们创建一个Qt应用程序进行测试。


5、整理下遇到的一些问题
问题一:使用Release方式编译,编译不通过!

Qt5Core.lib(qobject.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(main.obj 中)

原因及解决方法:

因为我们编译的Qt5.11.2的VC运行库是MT和MTd,工程向导创建的缺省是MD和MDd。也就是我们需要把运行库对应的值改了。


问题二:

LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

原因及解决方法:

在同一个项目中,所有的源文件必须链接相同的VC运行时库。如果某一文件用了MTd版本,而其他文件用MT版本的库,也就是说用了不同的库,就会导致这个警告的出现。        添加一下命令行可解决:
/NODEFAULTLIB:“libcmt.lib”

问题三:

Qt5Core.lib(qglobal.obj) : error LNK2019: 无法解析的外部符号 gethostname,该符号在函数 “public: static class QString __cdecl QSysInfo::machineHostName(void)” (?machineHostName@QSysInfo@@SA?AVQString@@XZ) 中被引用
Qt5Core.lib(qglobal.obj) : error LNK2019: 无法解析的外部符号 WSAStartup,该符号在函数 “public: __cdecl QWindowsSockInit:WindowsSockInit(void)” (??0QWindowsSockInit@@QEAA@XZ) 中被引用
Qt5Core.lib(qglobal.obj) : error LNK2019: 无法解析的外部符号 WSACleanup,该符号在函数 “public: __cdecl QWindowsSockInit::~QWindowsSockInit(void)” (??1QWindowsSockInit@@QEAA@XZ) 中被引用

原因及解决方法:
显然,这是因为有些依赖库我们没添加好!因此只要把必要的一些依赖文件添加进来一般都是能够解决!

附加库目录改成:$(QTDIR)\lib; $(QTDIR)\plugins\imageformats; $(QTDIR)\plugins\platforms;%(AdditionalLibraryDirectories)
附加依赖项改成:Qt5AccessibilitySupport.lib;Qt5Network.lib;qtpcre2.lib;qtmain.lib;qwindows.lib;Qt5Widgets.lib;Qt5Core.lib;Qt5Gui.lib;Qt5PlatformCompositorSupport.lib;Qt5EventDispatcherSupport.lib;Qt5FontDatabaseSupport.lib;Qt5ThemeSupport.lib;Qt5WindowsUIAutomationSupport.lib;qgif.lib;qico.lib;qjpeg.lib;qtfreetype.lib;qtharfbuzz.lib;qtlibpng.lib;%(AdditionalDependencies)

在main.cpp文件中加入代码:
    ##pragma comment(lib, "version.lib")
        #pragma comment(lib, "Netapi32.lib")
        #pragma comment(lib, "userenv.lib")
        #pragma comment(lib, "msvcrtd.lib")
        #pragma comment(lib, "Dwmapi.lib")
        #pragma comment(lib, "wtsapi32.lib")
        #pragma comment(lib, "Wsock32.lib")
        #pragma comment(lib, "Imm32.lib")
        #pragma comment(lib, "Winmm.lib")
        #pragma comment(lib, "ws2_32.lib")
距离成功我们又进一步了,继续编译。。(如果依然会报类似的错误提示,可以自行尝试继续添加其他一些必要的依赖文件试试!)

问题四:


qt.qpa.plugin: Could not find the Qt platform plugin “windows” in “”
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

原因及解决方法:

插件无法加载,加载plugin的办法:
使用宏 Q_IMPORT_PLUGIN,在main.cpp中增加代码如下:

```
        #include <QtCore/QtPlugin>
        Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
```
1
2
3
4
继续执行,发现可以了~ 成功了!

————————————————
版权声明:本文为CSDN博主「YeeZo.」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_16395987/article/details/84564728



回复 支持 反对

使用道具 举报

1272

主题

2067

帖子

7958

积分

认证用户组

Rank: 5Rank: 5

积分
7958
地板
 楼主| 发表于 2020-3-25 19:50:34 | 只看该作者
1>qrc_360safe.cpp
1>Qt5Widgetsd.lib(qwidget.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”(about_us.obj 中)
1>Qt5Widgetsd.lib(qdialog.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”(about_us.obj 中)
1>Qt5Widgetsd.lib(qlabel.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”(about_us.obj 中)
1>Qt5Widgetsd.lib(qabstractbutton.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”(about_us.obj 中)
1>Qt5Widgetsd.lib(qpushbutton.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”(about_us.obj 中)

项目属性 -> 配置属性 -> C/C++ -> 代码生成 -> 运行库
都设置一样就行了 多线程调试Dll(/MTd)  ->多线程调试(/MTd)


回复 支持 反对

使用道具 举报

1272

主题

2067

帖子

7958

积分

认证用户组

Rank: 5Rank: 5

积分
7958
板凳
 楼主| 发表于 2020-3-25 19:40:33 | 只看该作者
本帖最后由 Qter 于 2020-3-25 19:43 编辑

严重性        代码        说明        项目        文件        行        禁止显示状态
错误        C1083        无法打开包括文件: “QDialog”: No such file or directory        


右键项目->Qt->Qt Projects setting -> Qt Modules  选 上 Core Widgets  GUI Network



Qt5的GUI模块变动了,所有的QWidget都被剥离出来,单独成为qtwidgets模块
所以pro里要添加如下的代码:
        greaterThan(QT_MAJOR_VERSION, 4): QT += widgets然后在构建菜单下  清理项目
在构建菜单下  重新执行qmake
在构建菜单下  构建项目“***”
在构建菜单下  运行


回复 支持 反对

使用道具 举报

1272

主题

2067

帖子

7958

积分

认证用户组

Rank: 5Rank: 5

积分
7958
沙发
 楼主| 发表于 2020-3-24 23:09:56 | 只看该作者
Qt实现360安全卫士9.2界面博客地址

http://blog.sina.com.cn/s/articlelist_2801495241_9_1.html

源码下载地址

地址1:http://download.csdn.net/detail/u011012932/6396621
地址2:http://pan.baidu.com/s/1mgBr8qk

效果图:




回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-23 07:59 , Processed in 0.067005 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表