![]() |
很拉风的水煮肉 · 发布QtCsv文件转语言翻译文件工具-腾讯云 ...· 9 月前 · |
![]() |
慷慨的橙子 · 11 个最佳的 Python ...· 1 年前 · |
![]() |
乐观的松球 · vue i18n 占位符-掘金· 1 年前 · |
![]() |
火星上的饼干 · Fabric.js ...· 2 年前 · |
![]() |
鼻子大的馒头 · python array太慢_python ...· 2 年前 · |
Electron使用 JavaScript, HTML 和 CSS 构建跨平台的桌面应用。1.官网https://electronjs.org/2.案例https://electronjs.org/appshttps://github.com/vladimiry/ElectronMail Unofficial desktop app for ProtonMailhttps://gitee.com/robergroup/pdmanhttps://github.com/qier222/YesPlayMusicFlutter谷歌开源UI框架Flutter | Flutter - Beautiful native apps in record timeFlutter | Flutter - Beautiful native apps in record timeFlutter中文网
Numpy和SciPy大名鼎鼎的NumPy python版本https://github.com/numpy/numpyhttps://github.com/dpilger26/NumCpp C++版本NumCpp: Main Page C++文档SciPy.org — SciPy.orghttps://github.com/scipy/scipymuparser许多应用程序需要解析数学表达式。该库的主要目的是提供一种快速简便的方法。 muParser是一个用C ++编写的可扩展的高性能数学表达式解析器库。 它的工作原理是将数学表达式转换为字节码并预先计算表达式的常量部分。muparser - fast math parser librarySageMath是一个免费的、开源的数学软件系统,采用GPL协议。它整合了许多开源Python包,采用Python语言编写,但也支持其他语言。它的目标是创造一个可变的开源软件以替代Magma、Maple、Mathematica和Matlab。Sage不仅是一个软件,也是一个编程环境,提供命令行模式、笔记本模式,可以编写编译型程序和解释型程序。目前Sage支持Linux、Mac OS X、BSD、Solaris平台。SageMath - Open-Source Mathematical Software SystemGSL(GNU Scientific Library)是一个开源的科学计算的函数库,功能非常强大。有超过1000个函数,该库提供了关于数学计算的很多方面,Matlab的大部分函数几乎都能借助它实现,可以在数值计算中省却很多事情。GSL - GNU Scientific Library - GNU Project - Free Software Foundationftp://ftp.gnu.org/gnu/gsl/详情见我的博客:开源项目推荐:GSL科学计算函数库(GNU Scientific Library),实现VS2019源码编译_$firecat全宏的代码足迹$-CSDN博客Octave是一种编程语言,旨在解决线性和非线性的数值计算问题。4.0.0版本发布基于QT编写的GUI交互界面。Octave语法与Matlab语法非常接近,可以很容易的将matlab程序移植到Octave。同时与C++,QT等接口较Matlab更加方便。GNU OctaveIndex of /gnu/octave/Ceres Solveris an open source C++ library for modeling and solving large, complicated optimization problems. 来自谷歌.Ceres Solver是一个开源C ++库,用于建模和解决大型复杂的优化问题。具有边界约束的非线性最小二乘问题;一般无约束优化问题。Ceres solver 是谷歌开发的一款用于非线性优化的库,在谷歌的开源激光雷达slam项目cartographer中被大量使用。Ceres官网上的文档非常详细地介绍了其具体使用方法,相比于另外一个在slam中被广泛使用的图优化库G2O,ceres的文档可谓相当丰富详细(没有对比就没有伤害,主要是G2O资料太少了,对比起来就显得ceres的很多)Ceres Solver — A Large Scale Non-linear Optimization Libraryg2oA General Framework for Graph OptimizationOpenSLAM.orghttps://github.com/RainerKuemmerle/g2oPCLThe Point Cloud Library (PCL) is a standalone, large scale, open project for 2D/3D image and point cloud processing.Point Cloud Library | The Point Cloud Library (PCL) is a standalone, large scale, open project for 2D/3D image and point cloud processing.https://github.com/PointCloudLibrary/pclEigenis a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms.Eigen是一个C++开源线性代数库:提供矩阵的线性代数运算。Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它里面包含了很多算法。它的License是MPL2。它支持多平台。Eigen采用源码的方式提供给用户使用,在使用时只需要包含Eigen的头文件即可进行使用。之所以采用这种方式,是因为Eigen采用模板方式实现,由于模板函数不支持分离编译,所以只能提供源码而不是动态库的方式供用户使用。Eigen是一个只有头文件的库。http://eigen.tuxfamily.orglibeigen / eigen · GitLab 【推荐】https://github.com/eigenteam/eigen-git-mirrorhttps://bitbucket.org/eigen/eigen/src/default/CGAL全称就是Computational Geometry Algorithms Library,从名称就可以看出,CGAL就是计算几何的开源库。CGAL是用C++语言写的计算几何最经典的开源库。The Computational Geometry Algorithms Library详情见我的博客:GIS系列专题(1):GDAL/Shapely/GEOS/2geom/Grass/Clipper/CGAL计算几何算法库_$firecat全宏的代码足迹$-CSDN博客Geos全称就是Geometry Engine Open Source,从名称就可以看出,Geos就是判断几何体的过程。Geos是用C++语言写的处理计算几何的开源库。GEOS详情见我的博客:GIS系列专题(1):GDAL/Shapely/GEOS/2geom/Grass/Clipper/CGAL计算几何算法库_$firecat全宏的代码足迹$-CSDN博客ClipperClipper库是目前计算机图形领域广为使用的图形处理库,可以用于解决平面二维图形的多边形简化、布尔运算和偏移处理,在CAD、加工路径与3D打印方面都有着比较重要的应用。详情见我的博客:GIS系列专题(2):Clipper计算机图形库使用说明(Vatti‘s clipping algorithm)_$firecat全宏的代码足迹$-CSDN博客Armadillo:C++ library for linear algebra & scientific computing数据类型都定好了,基本运算的算符也重载了,用起来跟Matlab差不多Armadillo: C++ library for linear algebra & scientific computingwykobi:几何计算数学库A C++ library of efficient, robust and simple to use C++ 2D/3D oriented computational geometry routines. http://www.wykobi.com/tutorial.htmlDlibA toolkit for making real world machine learning and data analysis applications in C++https://github.com/davisking/dlibOGRE:scene-oriented, flexible 3D engine written in C++OGRE - Open Source 3D Graphics Engine | Home of a marvelous rendering engineOGRE: API Reference Start Page Modules-Core-Mathhttps://github.com/OGRECave/ogreCinder is a free and open source library for professional-quality creative coding in C++https://libcinder.org/docs/ MathNURBSNURBS, B-Splines, and Bézier curves/Bessel Curve Fitting贝塞尔曲线拟合0、NURBS开源项目http://libnurbs.sourceforge.net/old/ ++ https://sourceforge.net/projects/libnurbs/files/ nurbs++-3.0.11https://download.csdn.net/download/zhai_ht/4983882 Nurbs3.0.11开源库vs2010源代码https://www.sintef.no/projectweb/geometry-toolkits/sisl/ ++ https://github.com/SINTEF-Geometry/SISL SISLhttps://www.gnu.org/software/gsl/doc/html/interp.html GSLhttps://github.com/pradeep-pyro/tinynurbshttps://github.com/msteinbeck/tinysplinehttps://github.com/mcneel/opennurbsNURBS-PythonNURBS-Python :: Onur Rauf Bingol GitHub - orbingol/NURBS-Python: Object-oriented pure Python B-Spline and NURBS librarygeomdl · PyPI1、贝塞尔开源项目https://github.com/oysteinmyrmo/bezierhttps://github.com/stribor14/Bezier-cpp Fast and lightweight class for using the Bezier curves贝塞尔曲线底漆 A Primer on Bézier Curveshttps://github.com/Pomax/BezierInfo-2Android 绘制N阶Bezier曲线 https://github.com/venshine/BezierMaker三次Beizer曲线拟合算法2、B样条开源项目三次B样条曲线拟合算法 三次参数样条,优势是光滑连接。拟合轮廓效果还是可以,较之Beizer,B样条将一些细节描述的很好,很多细节之处都贴近原轮廓,但是有一些不足之处,可以看到对直线拟合效果不是很好。三次样条插值(Cubic Spline Interpolation)简称Spline插值,是通过一系列形值点的一条光滑曲线,数学上通过求解三弯矩方程组得出曲线函数组的过程。三次样条曲线拟合VC++Opencv 三次样条曲线(Cubic Spline)插值https://github.com/msteinbeck/tinysplinehttps://github.com/bgrimstad/splinterhttps://github.com/ttk592/splinehttps://github.com/andrewwillmott/splines-libhttps://github.com/ejmahler/SplineLibraryhttps://github.com/ebertolazzi/Splineshttps://github.com/pyzhangxiang/qt-curve-editorhttps://github.com/OpenTspline/OpenTspline Open source T-spline library★书籍推荐★《计算几何算法与实现(Visual C++版)》 孔令德,三次参数样条曲线《计算机图形学——基于MFC三维图形开发》 孔令德《数值计算方法与算法(第三版)》 张韵华OPENGL几何数学库GLMKhronos OpenGL® Registry - The Khronos Group Inchttps://github.com/KhronosGroup/OpenGL-Registryhttps://glm.g-truc.net/https://github.com/g-truc/glm OpenGL Mathematics (GLM) is a header only C++ mathematics libraryhttps://github.com/recp/cglm OpenGL Mathematics (glm) for Cglm常用的数据类型vec2 二维向量vec3 三维向量vec4 四维向量mat2 二阶矩阵mat3 三阶矩阵mat4 四阶矩阵常用的函数glm::radians() 角度制转弧度制glm::translate() 创建一个平移矩阵,第一个参数是目标矩阵,第二个参数是平移的方向向量glm::rotate() 创建一个将点绕某个轴旋转x弧度的旋转矩阵,第一个参数是弧度,第二个参数是旋转轴glm::scale() 创建一个缩放矩阵,第一个参数是目标矩阵,第二个参数是缩放系数TSP(Travelling Salesman Problem)经典问题旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。 旅行商问题是图论中最著名的问题之一,即“已给一个n个点的完全图,每条边都有一个长度,求总长度最短的经过每个顶点正好一次的封闭回路”。该问题通常被认为是一个NP完全问题。时间复杂度为O(n!)。因此,通常n的值不是很大。TSPSG | TSP Solver and Generator动态规划经典问题--TSP问题动态规划法求解TSP问题 C++求解TSP问题的几种经典智能算法比较(附完整代码)基于遗传算法的TSP算法TSP旅行商问题各种算法实现旅行商(TSP)问题专题——多种方法对比
一、环境准备VS2017,x64cmake-3.14.5-win64-x64.msiFreeCADLibs_12.1.2_x64_VC15.1.7z,源码依赖库,x64位,里面已集成boost/Qt5/Python等依赖环境,点击详细说明依赖库下载:https://github.com/FreeCAD/FreeCAD/releases/tag/0.19_preFreeCAD LibPack Version 12.1.2 debug/release with Visual Studio 2017 Qt 5.12.1 PySide2 build against Qt 5.12.1 Coin3D 4.0 Python 3.6.8 OpenCascade 7.3Boost 1.67 (including the debug files build against python_d.exe)源码:https://github.com/FreeCAD/FreeCAD/tree/0.19_pre二、CMake生成VS工程1、建工程注意,一定要选择x64,因为依赖库FreeCADLibs_12.1.2_x64_VC15.1.7z是64位的。这个很重要,如果误选了32位,则会报错:CMake Error at C:/Program Files/CMake/share/cmake-3.14/Modules/FindBoost.cmake:2165 (message): Unable to find the requested Boost libraries. Boost version: 1.67.0 Boost include path: F:/CADCAM/FreeCADLibs_12.1.2_x64_VC15.1/include Could not find the following Boost libraries: boost_filesystem boost_program_options boost_regex boost_system boost_thread Some (but not all) of the required Boost libraries were found. You may need to install these additional Boost libraries. Alternatively, set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost. Call Stack (most recent call first): CMakeLists.txt:654 (find_package) CMake Error at CMakeLists.txt:670 (message): ============================================= Required components: filesystem;program_options;regex;system;thread Not found, install the components: filesystem;program_options;regex;system;thread =============================================2、指定依赖库的路径3、勾选需要的功能模块4、先后点击按钮Configure和Generate。OK!三、异常处理如果CMake点击按钮Configure过程有boost库相关的错误信息,请打开项目的CMakeLists.txt文件F:\CADCAM\FreeCAD-master\CMakeLists.txt ,手动添加以下三句话,会有更详细的提示信息。set(Boost_DEBUG ON) #是否开启Boost Debug模式,ON位开启,OFF关闭。开启之后会输出很多调试信息,方便寻找错误set(Boost_ARCHITECTURE "-x32") # CPU架构,对应库文件文件名里的x32或者x64set(Boost_THREADAPI "win32") # 线程类型,对应thread模块文件名里面的pthread或者win32四、编译源码及依赖文件拷贝VS2017打开F:\CADCAM\FreeCAD-master\build\FreeCAD.sln,使用x64编译器编译。编译比较耗时,需要耐心等待。编译完成之后,程序还无法正常运行,需要把相关依赖文件附上:1.把F:\CADCAM\FreeCADLibs_12.1.2_x64_VC15.1\binF:\CADCAM\FreeCADLibs_12.1.2_x64_VC15.1\dataF:\CADCAM\FreeCADLibs_12.1.2_x64_VC15.1\resources拷贝到源文件工程目录F:\CADCAM\FreeCAD-master\build\resources文件夹的文件很重要,QWebEngine所需的一些关键文件qtwebengine_resources.pakqtwebengine_resources_100pqtwebengine_resources_200p.pak.pakQtWebEngineProcess.exeicudtl.dat 缺失了它们,F:\CADCAM\FreeCAD-master\src\Mod\Web\Gui\BrowserView.cpp源码运行会报错,抛出异常。QWebEngineProfile *profile = view->page()->profile();2.把F:\CADCAM\FreeCADLibs_12.1.2_x64_VC15.1\plugins\iconenginesF:\CADCAM\FreeCADLibs_12.1.2_x64_VC15.1\plugins\imageformatsF:\CADCAM\FreeCADLibs_12.1.2_x64_VC15.1\plugins\platformsF:\CADCAM\FreeCADLibs_12.1.2_x64_VC15.1\plugins\printsupportF:\CADCAM\FreeCADLibs_12.1.2_x64_VC15.1\plugins\sqldrivers拷贝到源文件工程目录F:\CADCAM\FreeCAD-master\build\bin3.把F:\CADCAM\FreeCADLibs_12.1.2_x64_VC15.1\translations\qtwebengine_locales拷贝到源文件工程目录F:\CADCAM\FreeCAD-master\build\bin五、其他版本同样适用上述的方法,同样适用于以下环境:VS2019+Qt5.12.9 x64+FreeCAD v0.18.5+FreeCADLibs_12.1.6_x64_VC15https://github.com/FreeCAD/FreeCAD/tree/0.18.5main函数的入口:F:\Software\CADCAM\FreeCAD\FreeCAD-0.18.5\src\Main\MainGui.cpp---FreeCAD是一个基于OpenCASCADE的开源CAD/CAE工具。 OpenCASCADE是一套开源的CAD/CAM/CAE几何模型核心,来自法国Matra Datavision公司,是著名的CAD软件EUCLID的开发平台。https://github.com/FreeCAD/FreeCADhttps://www.freecadweb.org/wiki/Getting_started/zh-cn 入门教程https://forum.freecadweb.org/index.php 社区https://www.freecadweb.org/https://www.freecadweb.org/wiki/CompileOnWindows 源码编译说明https://github.com/FreeCAD/FreeCAD-ports-cache/releases 依赖库官方发布https://github.com/apeltauer/FreeCAD/releases 依赖库非官方纯私人发布,版本比较新https://github.com/FreeCAD/FreeCAD_Conda 依赖库新方式https://www.opencascade.com/ 官网https://www.opencascade.com/content/download-centerhttps://www.opencascade.com/content/latest-releasehttps://cmake.org/https://cmake.org/files/
一、先说说我的个人心得我新建了C++ win32动态库工程,准备调用C#类库。//使用CLR的方式,成功实现C++调用C#类库,注意事项://1.//不要尝试在DllMain或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。//解决办法://注释掉dllmain.cpp文件里的主函数BOOL APIENTRY DllMain//2.//本人在实践工程中遇到两个难点://(1)CLR/CLI链接器失败,错误LNK2022 - 自定义属性不一致//(2)软件发布,Windows7 64位纯净版,软件启动时,出现KERNELBASE.dll错误//问题原因及解决方法://.NET版本不匹配,请安装需要的.NET版本,详情见第3点说明//3.//visual studio如何修改c++项目的.net framework框架版本//修改项目文件//在 Visual Studio 的“解决方案资源管理器”中,打开项目的快捷菜单,然后选择“卸载项目”。 //这将为你的项目卸载项目文件(.vcxproj)。//在菜单栏上,依次选择“文件”、“打开”、“文件”。 在“打开文件”对话框中,导航到项目文件夹,//然后打开项目文件(.vcxproj)。在项目文件中,找到目标 Framework 版本的条目。 //例如,如果你的项目设计为使用.NET Framework 4.5,<PropertyGroup Label = "Globals">元素中找到//请在<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>元素//如果 <TargetFrameworkVersion> 元素不存在,则新增之,并修改相应版本号。//4.//VC++的平台工具集如果是MSVC2015,则.NET框架至少要4.0版本//VC++的平台工具集如果是MSVC2013,则.NET框架可以是3.5版本//考虑到纯净版的Windows 7操作系统自带的.NET版本是3.5,所以建议C++工程使用MSVC2013编译;//因为客户的Win7电脑不一定会有.NET4.0,这样我们自己可以省得每次设备出货时安装.NET4.0框架二、再来看网上摘录的经验总结C++编写的程序为非托管代码,C#编写的程序为托管代码。托管代码虽然提供了其他开发平台没有的许多优势,但由于前期系统及历史版本很多使用的是非托管代码编写的程序,所以CLR提供了一些机制,允许在应用程序中同时包含托管和非托管代码。具体说分为以下三种:1、托管代码能调用DLL中的非托管函数。通过P/Invoke(Platform Invoke)机制调用DLL中的函数,如Kernel32.dll等。2、托管代码可以使用现有COM组件(服务器)。许多公司都已经实现了大量非托管COM组件。利用来自这些组件的类型库,可创建一个托管程序集来描述COM组件。托管代码可像访问其他任何类型一样访问托管程序集中的类型。3、非托管代码可以使用托管类型(服务器)。许多现有的非托管代码要求提供COM组件来确保代码正确工作。使用托管代码可以更简单地实现这些组件,避免所有代码都不得不和引用计数和接口打交道。比如C++调用C#开发的dll。那C++如何调用C#写的库?查了网上的资料,目前知道两种情况,一种是用C++/CLI(通用语言接口),另一种则是使用COM组建。总结:1)用C#写任何的类库2)C++ 中要引用此类库,使用#using引用C#编写的DLL,而不是#include,引用C#的DLL后,还需要添加该DLL的命名空间using namespace MathDLL3)创建C#对象时要用gcnew ;4) C++ 编译设置一定设置为:支持公共语言运行时支持(/clr),使用C++/clr语法,采用正确的方式访问托管对象,即:使用帽子“^”,而不是“*”5) 自身的C++类要用 ref class 定义。6)#using "..\\TestDLL\\bin\\Debug\\TestDLL.dll" 这是VC++托管代码中调用.net DLL的方法,如果是原生C++代码,不能这么调用,要用COM方式,但是被调用的必须是public static方法。7)CSDN赵4老师的建议是:不要做A语言代码修改为B语言代码的无用功。也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。即可很方便地让A、B两种语言之间协调工作。比如:A将请求数据写到文件a.txt,写完后改名为aa.txtB发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txtA发现bb.txt存在时,读取其内容,读完后删除bb.txt以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。除非A或B不支持判断文件是否存在、文件读写和文件更名。但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?可以将临时文件放在RamDisk上提高效率减少磨损磁盘。数据的结构很复杂的话,文本文件的格式问题可参考json或xml共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:·进程之间松耦合·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。·方便在线开关服务,只需删除或创建该临时文本文件即可。·方便实现分布式和负载均衡。·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)·……“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,回头是“使用共享纯文本文件进行信息交流”的岸!三、转载网上文章《N种方法使用C++调用C#.NET库》常规方法1:COM使用C#把托管类注册成COM,用regasm.exe注册output assembly,然后用C++像调用COM一样调用assembly里面的type。优点:编写代码简单,调用方便缺点:需要注册output,发布不够简单参考:http://www.codeproject.com/KB/cs/ManagedCOM.aspx常规方法2:CLRC#常规编写类,生产assembly,C++使用CLR编译既可直接引用托管类。优点:编写代码简单,调用方便缺点:需要了解C++ CLR语法(既不像C++,又不像C#,总之很奇怪)参考:http://www.codeproject.com/KB/mcpp/cppcliintro01.aspx http://msdn.microsoft.com/en-us/library/k8d11d4s.aspx常规方法3:APIC#常规编写类,生产assembly,C++使用SDK提供的CLR非托管接口(CLRCreateInstance)进行调用。优点:传统C#编程,传统C++编程缺点:要求.Net Framework 4.0以上版本参考:http://nport.codeplex.com/SourceControl/changeset/view/45681#903468 http://msdn.microsoft.com/en-us/library/dd537633.aspx变通方法:1. 使用C#/VB包装现有托管类,注册成Windows服务,暴露SOAP web service。VC2005可以使用非托管代码添加引用Web service。2. 使用C#/VB包装现有托管类,注册成Windows服务。C++利用Windows message和服务通讯。3. 使用C#/VB包装现有托管类,注册成Windows服务。C++利用Windows共享内存和服务通讯。其实利用双进程通讯的方法,可以演变出各种各样调用的思路。聪明的你可以充分发挥想象力,写出自己独有的调用模式。---参考文献:https://www.cnblogs.com/bylikai/p/4695317.html CLRhttps://www.cnblogs.com/huangmianwu/p/6145044.html COMhttps://blog.csdn.net/shq886258963/article/details/59057797 两种都有https://blog.csdn.net/sudazf/article/details/52160514 这个好从C++到C++/CLI 科普https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-4.0/ms172271(v=vs.100)https://docs.microsoft.com/en-us/previous-versions/ms235289(v=vs.140)https://docs.microsoft.com/zh-cn/cpp/dotnet/initialization-of-mixed-assemblies?view=vs-2019
本人在C++项目中经常需要用到get和set方法,但是c++并不像 java的eclipse有自动生成 get 和 set 方法。如果手写是可以,但是当属性特别多的时候会非常麻烦。。。于是决定使用宏定义方法来解决。本人在参考了网上资料(参见文章末尾的参考文献)之后,实现了自己的版本,cplusplusgetset.h头文件如下:#pragma once //PropertyBuilderByTypeName 用于生成类的成员变量 //并生成set和get方法 //variable_type为变量类型,可以是指针类型,也可以是非指针类型,例如int,int*等 //type_shortname为变量类型的缩写,例如bool缩写为b,int缩写为i,double缩写为d等 //method_name为方法名称 //access_permission为变量的访问权限(public, protected, private) #define PropertyBuilder_ReadWrite(variable_type, type_shortname, method_name, access_permission)\ access_permission:\ variable_type m_##type_shortname##method_name;\ public:\ inline variable_type get##method_name(void)\ return m_##type_shortname##method_name;\ inline void set##method_name(variable_type v)\ m_##type_shortname##method_name = v;\ #define PropertyBuilder_ReadOnly(variable_type, type_shortname, method_name, access_permission)\ access_permission:\ variable_type m_##type_shortname##method_name;\ public:\ inline variable_type get##method_name(void) const\ return m_##type_shortname##method_name;\ #define PropertyBuilder_WriteOnly(variable_type, type_shortname, method_name, access_permission)\ access_permission:\ variable_type m_##type_shortname##method_name;\ public:\ inline void set##method_name(variable_type v)\ m_##type_shortname##method_name = v;\ }\使用说明:class MyClass public: MyClass() m_bLookAhead = true; m_dStatus = NULL; m_iHello = 0; ~MyClass() {} PropertyBuilder_ReadWrite(bool, b, LookAhead, protected)//bool m_bLookAhead; PropertyBuilder_ReadWrite(double*, d, Status, protected)//bool* m_pStatus; PropertyBuilder_WriteOnly(int, i, Hello, private)//int m_iHello; public: void test() setLookAhead(true); double a = 0; setStatus(&a); setHello(5); bool r = getLookAhead(); };---参考文献https://blog.csdn.net/Scythe666/article/details/48846761https://www.codeproject.com/Articles/118921/C-Properties%20Introduction
官网:http://translate.digitser.cn/http://dt.digitser.cn/zh-CN/app/translate/download.html官方软件说明:(详细内容请看http://forum.digitser.cn/thread-2293-1-1.html)本文所要介绍的 Qt/C++ *.ts *.qm 文件,"德云社区" 2009 年前后因需汉化 AutoDesk 公司 "MudBox 数字雕刻与纹理绘画软件" 界面。那时,百度、Google 搜索 *.ts *.qm 文件资源还很少,当然,现在也不算多。*.ts *.qm 文件*.qm 文件是从 *.ts 文件,采用 Qt 自带的 lrelease.exe 并运行相关 CMD 命令或由 Qt 自带的 linguist.exe 应用生成的 "Qt Multi-language" 本地化文件。*.ts 文件是从 Qt/C++ 或相关绑定 (如 Python 语言绑定 PyQt、PySide) 源代码中,提取出来的 "Translate Source 翻译资源" 文件。采用 Qt 自带的 lupdate.exe 并运行相关 CMD 命令,在 Windows OS 下提取 *.cpp (Qt/C++ 源文件) 或 *.py (Python 语言绑定 PyQt、PySide 源文件) 可获得 *.ts 文件。"德云社区" 以前是将 *.ts 文件批量导入德国 Passolo (后被 SDL Trados 塔多斯收购) 或 Qt 自带的 linguist.exe 应用中翻译并生成 *.qm 文件。但效率不高,且用户体验也不行;因此,"德云社区" 才制作了以下一系列专用小程序,都集成在 "数字翻译" 和 "数字 IDE 专业版" 应用中,未单独发布:5 倍以上效率提升 CPU多线程-多进程 GUI文档 网站站群 "机器-人工翻译" 工具---题外话:推荐一个小工具:https://github.com/Longxr/TSFileEditor
一般MFC开发的时候,如果有些资源是从其他工程中移植到本工程的,而在资源移植的时候都要将对应的资源ID复制到本工程的resource.h文件中。此时不管你在不在本工程中添加资源ID,resource.h文件中的ID可能都有重复的,一般再添加资源ID后,肯定有重复的。此外,随着界面越来越多,各种控件对话框的ID都堆积在一起,令人看得闹心。今天我自己整理了一个小工具,可以打开Resource.h文件进行转换,即可解决此问题。重新排序并去重复ID。1、使用说明(1)本程序将MFC资源文件Resource.h中的ID重新整理和排序;按照字母顺序排序,拒绝重复ID;(2)怕引发意外问题,程序不会改动原MFC的默认资源序号,例如:#define IDR_MAINFRAME 128维持现状不变(3)要求resource.h文件的编码必须是Windows系统默认的ANSI,否则会出现乱码;(4)MFC工程如果使用了ribbon工具栏,需要手动把res文件夹下的ribbon.mfcribbon-ms文件删除重建,否则MFC工程启动会报错;因为ribbon文件里的ID已经重新排序了,ID错位会导致消息映射混乱。如何删除重建ribbon.mfcribbon-ms?先进入VS资源视图->*.rc->Ribbon->IDR_RIBBON,双击打开ribbon工具栏;然后再去res路径删除ribbon.mfcribbon-ms文件;(注意删除之前一定先完成第1步,在资源视图打开ribbon工具栏,否则ribbon.mfcribbon-ms文件删除之后就再也打不开工具栏了)回到ribbon工具栏,随便修改里面的一个菜单文本或图标,然后点击保存,就会自动重新生成ribbon.mfcribbon-ms文件。(5)另外,请注意一点:文本打开res\*.rc文件,跳转到Icon栏目,微软官方有说法:// Icon with lowest ID value placed first to ensure application icon// remains consistent on all systems.就是说,目标文件exe使用的图标,优先考虑ID值最小的图标文件。所以你需要确认IDR_MAINFRAME的数值是否比其他ico文件的id小。(6)谨慎起见,建议转换前备份Resource.h和ribbon.mfcribbon-ms文件2、完整的源码和可执行文件请下载:https://download.csdn.net/download/libaineu2004/11221588---引申阅读,我从网上搜索的教程得知的---一、MFC如何删除未使用的资源符号?1:打开资源视图(ctrl+shift+e,或者从视图选项中打开,或者双击资源文件夹中的 .rc 文件)2:右击资源视图中的 .rc 文件夹,打开 ID= 资源符号 项 3:在弹出的对话框中可以看到那些资源符号正在使用,那些未使用4:可以删除未使用的资源符号 -- firecat注:个人感觉不靠谱,容易误删。二、新建一个标准的MFC程序,留意到在Resource.h中默认有这样一段宏定义// Next default values for new objects //#ifdef APSTUDIO_INVOKED#ifndef APSTUDIO_READONLY_SYMBOLS#define _APS_3D_CONTROLS 1#define _APS_NEXT_RESOURCE_VALUE 130#define _APS_NEXT_COMMAND_VALUE 32773#define _APS_NEXT_CONTROL_VALUE 1000#define _APS_NEXT_SYMED_VALUE 101#endif#endif对照了一下自己初建的一个简单的单文档程序,找到了一些端倪,#define _APS_NEXT_CONTROL_VALUE 1000,那么我就新建一个对话框,并在其中拉出一个控件,重新编译,之后回到Resource.h中查看,其ID值正是1000,其他几项不用解释相信大家已经知道怎么使用了。firecat注:这些宏就是指定了每次新增控件时,ID从哪里开始算起。可以自行修改。
Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具。它广泛应用于工业界和学术界,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。Dlib的开源许可证 允许您在任何应用程序中免费使用它。Dlib有很长的时间,包含很多模块,近几年作者主要关注在机器学习、深度学习、图像处理等模块的开发。一、官网http://dlib.net/http://dlib.net/files/ 源码下载http://dlib.net/compile.html 编译说明https://github.com/davisking/dlib二、教程https://blog.csdn.net/Dawnfox/article/details/77282246 win10之dlib安装过程(c++调用库,非python版)https://blog.csdn.net/yiyuehuan/article/details/70667318 Dlib相关问题https://jingyan.baidu.com/article/48b37f8d0461831a6464889c.html Dlib机器学习库的安装和使用三、我个人的VS2015环境配置(Dlib v19.1版本之后必须要VS2015才能编译)1、使用CMake转换生成VS2015工程。使用默认配置即可,不修改任何参数。2、VS2015打开Dlib 程。点击dlib属性页。需要注意的地方有两处。(1)配置属性》c/c++》常规中的附加包含目录,需要添加dlib解压文件dlib目录中external中的libjpeg,libpng,zlib三个文件目录D:\My Resources\7-cmakeprj\dlib-19.17\dlib\external\libjpegD:\My Resources\7-cmakeprj\dlib-19.17\dlib\external\libpngD:\My Resources\7-cmakeprj\dlib-19.17\dlib\external\zlib(2)配置属性》c/c++》预处理器中的预处理器定义。需要注意是否存在DLIB_JPEG_SUPPORTDLIB_PNG_SUPPORTDLIB_JPEG_STATIC(3)Debug和Release分别编译,生成dlibd.lib和dlib.lib3、VS2015新建新建Win32控制台应用工程,测试dlib库是否可以用。(1)把Dlib源码包拷贝到Win32 exe工程。(2)Win32 exe工程,配置属性》c/c++》常规中的附加包含目录..\dlib-19.17..\dlib-19.17\dlib\external\libjpeg..\dlib-19.17\dlib\external\libpng..\dlib-19.17\dlib\external\zlib注意,千万不要包含..\dlib-19.17\dlib,否则会报错:***\dlib\dlib-19.4\dlib\dlib_include_path_tutorial.txt(1): fatal error C1189: #error: “Don’t put the dlib folder in your include path”(3)Win32 exe工程,配置属性》c/c++》预处理器中的预处理器定义,添加:DLIB_JPEG_SUPPORTDLIB_PNG_SUPPORTDLIB_JPEG_STATIC(4)Win32 exe工程,配置属性》链接器》常规中的附加库目录。添加dlib.lib所在文件目录..\Dlib-19.17\Win32(5)Win32 exe工程,配置属性》链接器》输入的附加依赖项。添加dlibd.lib和dlib.lib。(6)如果在链接(编译一般不会有问题)的时候出现下面的问题error LNK2001: 无法解析的外部符号 USER_ERROR__missing_dlib_all_source_cpp_file__OR__inconsistent_use_of_DEBUG_or_ENABLE_ASSERTS_preprocessor_directives那么就需要将 dlib/all/source.cpp 该文件添加到Win32 exe项目中,注意要以添加现有项的方式直接选取该文件。若没有出现上面的问题,则一般不需要添加该文件。添加soure.cpp,编译会报错:在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”解决办法是:鼠标右键soure.cpp,属性,不使用预编译头4、如何使用SQLite,官网下载https://www.sqlite.org/download.html,sqlite-amalgamation-3280000.zip解压,自己新建工程编译成静态库,请参考:https://blog.csdn.net/starelegant/article/details/72822308然后把sqlite3.h拷贝到路径\Dlib-19.17\dlib\sqlite即可。修改\Dlib-19.17\dlib\sqlite.h头文件#include <sqlite3.h>//原来#include "sqlite3.h" //firecat修改后5、把\dlib-19.17\tools\visual_studio_natvis\dlib.natvis拷贝到C:\Users\<用户名>\Documents\Visual Studio 2015\Visualizers四、MFC建立项目,发现内存泄漏使用windbg可以检测到:1b55c8d SmartDispenser!operator new+0x0000000d1826e7e SmartDispenser!dlib::threads_kernel_shared::thread_pool+0x0000008e1539eb0 SmartDispenser!dlib::unregister_thread_end_handler<dlib::logger::global_data>+0x0000004015c6e5a SmartDispenser!dlib::logger::global_data::~global_data+0x0000005a16557cb SmartDispenser!dlib::logger::global_data::`scalar deleting destructor'+0x0000002b15c8b51 SmartDispenser!dlib::logger::~logger+0x000000e11bf6968 SmartDispenser!dlib::logger_helper_stuff::`dynamic atexit destructor for 'log''+0x00000028我提交的问题:https://github.com/davisking/dlib/issues/1784解决方法:https://github.com/davisking/dlib/blob/master/dlib/threads/threads_kernel_shared.cpp#L78说白了就是Dlib-19.17\dlib\threads\threads_kernel_shared.cpp,把变量值修改一下://do_not_ever_destruct = true;do_not_ever_destruct = false; //firecat,Detected memory leaks五、Dlib主要功能主要特点文档丰富与许多开源项目不同的是,Dlib为每个类和功能提供了完整和精确的文档。同时它还有调试模式,可以帮助你检查使用某个函数的先决条件。启用此功能后,它将捕获由于错误地调用函数或以不正确的方式使用对象而导致的绝大多数错误。提供了许多示例程序(非常有用的示例!)我认为文档是函数库最重要的部分。因此,如果您发现任何未记录的内容,不清楚或已过时的文档,请告诉原作者,作者会及时修复它。高质量的广泛兼容的代码好的单元测试覆盖率。代码的单元测试行与库代码行之比约为1到4。该库在MS Windows,Linux和Mac OS X系统上定期进行测试。事实上,它可以在任何POSIX系统上运行,并且已经在Solaris,HPUX和BSD上使用。没有其他软件包依赖。只需要通过开箱即用的操作系统提供的底层API。在使用库之前,不需要安装或配置步骤。有关详细信息,请参阅 如何编译页面。所有操作系统特定的代码都被隔离在尽可能小的操作系统抽象层中。库的其余部分要么在OS抽象层之上分层,要么是纯ISO标准C ++。机器学习算法深度学习Deep Learning传统的基于SMO的支持向量机用于分类(classification) 和 回归(regression)用于大规模分类 和回归的Reduced-rank methods用于分类 和回归的推荐相关向量机(Relevance vector machine)通用多类分类(multiclass classification)工具一个多类SVM(Multiclass SVM)解决与结构支持向量机(structural support vector machines)相关的优化问题的工具 。用于序列标记(sequence labeling)的结构SVM工具用于解决分配问题(assignment problems)的结构SVM工具用于图像中物体检测(object detection)的结构SVM工具以及用于物体检测的更强大(但更慢)的深度学习工具(deep learning tools for object detection)。用于标记图中节点的结构SVM工具(labeling nodes)一个大规模的SVM-Rank实现在线核RLS回归(kernel RLS regression)算法在线SVM分类(SVM classification)算法半确定度量学习(Semidefinite Metric Learning)在线核化的质心估计器(centroid estimator) /新颖检测器和离线支持矢量一类分类器(one-class classification)聚类算法:线性 或核k-means, Chinese Whispers聚类和 Newman聚类。径向基函数网络(Radial Basis Function Networks)多层感知器(Multi layer perceptrons)数值计算算法使用表达式模板技术实现的快速矩阵对象,并且在可用时能够使用BLAS和LAPACK库。为矩阵对象定义了许多线性代数和数学运算,如 奇异值分解, 转置, 三角函数等。使用共轭梯度, BFGS和 L-BFGS 技术的通用非约束非线性优化算法Levenberg-Marquardt用于求解非线性最小二乘问题通过BOBYQA算法进行箱约束无导数优化的的实现割平面算法优化(Optimized Cutting Plane Algorithm)Several quadratic program solvers用于求解最优分配和 最小切割/最大流动问题的组合优化工具 以及用于查找most probable parse tree的CKY算法一个大整数对象一个随机数对象图形模型推理算法加入树算法在贝叶斯网络中进行精确推理。吉布斯采样马尔可夫链monte carlo算法用于贝叶斯网络中的近似推断。在链式结构, Potts或 一般因子图中执行MAP推断的例程 。图像处理用于读取和 保存常见图像格式的例程。各种像素类型之间的自动颜色空间转换常见的图像操作,如边缘检测和形态学操作SURF, HOG和FHOG 特征提取算法。用于图像中的对象检测的工具,包括 正面人脸检测和 对象姿势估计。高质量的人脸识别线程该库提供了一个可移植且简单的线程API用于线程间和进程间通信的消息传递管道一个计时器对象,能够生成按时间间隔排列的事件线程对象线程函数循环并行面向未来的thread_pool网络通信该库提供了一个可移植且简单的TCP套接字API帮助您制作基于TCP的服务器的对象iostream和streambuf 对象,使TCP套接字能够与C ++ iostreams库互操作一个简单的HTTP服务器对象,可用于将Web服务器嵌入到应用程序中用于线程间和进程间通信的消息传递管道用于使用批量同步并行(BSP)计算模型实现算法的工具图形用户界面该库提供了一个便携且简单的核心GUI API在核心GUI API的基础上实现了许多小部件与许多其他GUI工具包不同,整个dlib GUI工具包是线程安全的数据压缩和完整性检查算法CRC 32对象MD5功能代表数据压缩 算法部分的各种抽象对象。包括许多形式的PPM算法。测试在流行的Java日志记录器log4j之后的线程安全日志记录器对象模块化的单元测试框架各种断言宏对测试前置条件很有用其他通用功能一个类型安全的对象,用于在大小字节排序之间进行转换一个命令行解析器,能够使用各种参数和选项分析和验证命令行一个XML解析器可以执行base64转换的对象许多容器类序列化支持许多实现不同内存池策略的内存管理器对象一个工具,可以让您轻松地从MATLAB调用C ++---C++库大全https://github.com/fffaraz/awesome-cpp
The POCO C++ Libraries are powerful cross-platform C++ libraries for building network- and internet-based applications that run on desktop, server, mobile, IoT, and embedded systems.1、官网https://pocoproject.org/index.htmlhttps://pocoproject.org/releases/https://github.com/pocoproject/poco2、教程https://blog.csdn.net/walk_and_think/article/details/82432863 VS2013安装https://blog.csdn.net/arau_sh/column/info/poco-cpp-libhttps://blog.csdn.net/m1109048058/article/details/79624709 MFC中引入POCO库之后找不到API的问题在MFC项目中加入POCO库,导致MFC中的部分方法找不到。 比如: error C3861: “GetObject”: 找不到标识符 error C3861: “CreateFile”: 找不到标识符解决办法:在\Foundation\include\Poco\UnWindows.h文件中的注释部分已经说明。 方法1、使用对应方法的Unicode变体(e.g., GetUserNameW)和ASCII变体(GetUserNameA) 方法2、使用POCO_NO_UNWINDOWS的宏定义VC++属性页预编译头添加变量:_CRT_SECURE_NO_WARNINGSPOCO_NO_UNWINDOWS推荐方法1另外,多关注一下\Foundation\include\Poco\Config.h,里面有C++11的开关// without POCO_WIN32_UTF8 defined on Windows is deprecated.//#define POCO_WIN32_UTF8// Define to enable C++11 support#define POCO_ENABLE_CPP11\Foundation\include\Poco\Platform_WIN32.h3、我的编译方式(1)新建空项目(2)手动添加自己需要的库4、我使用MFC遇到的内存泄露问题:https://bbs.csdn.net/topics/392663362我是在MFC使用POCO库的,std:string存在内存泄露,解决方法是:Build poco with MFC Extension DLLs projects, not the windows DLL, then it can used with VC++/MFC参考https://github.com/pocoproject/poco/issues/2237说白了,就是(1)poco的项目属性页,常规,MFC的使用,选择“在共享 DLL 中使用 MFC”。(2)poco项目属性页,链接器,输入,附加依赖库,添加Advapi32.libAdvapi32.lib很重要,否则编译会报错:1>正在生成代码...1> 正在创建库 ..\lib\PocoFoundationd.lib 和对象 ..\lib\PocoFoundationd.exp1>EventLogChannel.obj : error LNK2019: 无法解析的外部符号 __imp__DeregisterEventSource@4,该符号在函数 "public: virtual void __thiscall Poco::EventLogChannel::close(void)" (?close@EventLogChannel@Poco@@UAEXXZ) 中被引用1>EventLogChannel.obj : error LNK2019: 无法解析的外部符号 __imp__RegisterEventSourceA@8,该符号在函数 "public: virtual void __thiscall Poco::EventLogChannel::open(void)" (?open@EventLogChannel@Poco@@UAEXXZ) 中被引用1>EventLogChannel.obj : error LNK2019: 无法解析的外部符号 __imp__ReportEventA@36,该符号在函数 "public: virtual void __thiscall Poco::EventLogChannel::log(class Poco::Message const &)" (?log@EventLogChannel@Poco@@UAEXABVMessage@2@@Z) 中被引用1>EventLogChannel.obj : error LNK2019: 无法解析的外部符号 __imp__RegCloseKey@4,该符号在函数 __catch$??1EventLogChannel@Poco@@MAE@XZ$0 中被引用1>EventLogChannel.obj : error LNK2019: 无法解析的外部符号 __imp__RegCreateKeyExA@36,该符号在函数 __catch$??1EventLogChannel@Poco@@MAE@XZ$0 中被引用1>EventLogChannel.obj : error LNK2019: 无法解析的外部符号 __imp__RegSetValueExA@24,该符号在函数 __catch$??1EventLogChannel@Poco@@MAE@XZ$0 中被引用1>RandomStream.obj : error LNK2019: 无法解析的外部符号 __imp__CryptAcquireContextA@20,该符号在函数 "public: virtual int __thiscall Poco::RandomBuf::readFromDevice(char *,__int64)" (?readFromDevice@RandomBuf@Poco@@UAEHPAD_J@Z) 中被引用1>RandomStream.obj : error LNK2019: 无法解析的外部符号 __imp__CryptReleaseContext@8,该符号在函数 "public: virtual int __thiscall Poco::RandomBuf::readFromDevice(char *,__int64)" (?readFromDevice@RandomBuf@Poco@@UAEHPAD_J@Z) 中被引用1>RandomStream.obj : error LNK2019: 无法解析的外部符号 __imp__CryptGenRandom@12,该符号在函数 "public: virtual int __thiscall Poco::RandomBuf::readFromDevice(char *,__int64)" (?readFromDevice@RandomBuf@Poco@@UAEHPAD_J@Z) 中被引用1>..\bin\PocoFoundationd.dll : fatal error LNK1120: 9 个无法解析的外部命令1>已完成生成项目“Foundation_vs140.vcxproj”的操作 - 失败。---题外话:1、介绍一个国产的C++库:ACL,跨平台,大而全One advanced C/C++ library for Linux, Mac, FreeBSD, Solaris(x86), Windows, Android, IOS https://github.com/acl-dev/aclhttps://blog.csdn.net/zsxxszhttps://zsxxsz.iteye.com/2、C++库大全https://github.com/fffaraz/awesome-cpp
结论:1、 PostMessage不能频繁的发送同一个消息,除非保证上次Post过的消息处理完成。2、 如果用SendMessage导致应用程序用户体验下降,应该检查消息处理函数,而不仅仅简单改为PostMessage。3、 如果消息是程序必须处理的,则不能使用PostMessage。消息队列满时,后面来的PostMessage的消息将被丢弃。4、 如果消息是程序必须处理,而又有可能导致程序卡死,则使用SendMessageTimeout。5、 如果消息是无关紧要的,则可以建议使用PostMessage。6、 对于WM_HOTKEY 等Windows特定的消息,则只能使用PostMessage(未在本文中说明)。1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。2, 如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回,SendMessage在同一线程中发送消息并不入线程消息队列。SendMessage要区分环境,如果是对本线程的窗口SendMessage,则不经过任何消息循环,也不放入消息队列,直接调用WindowProc,所以GetMessage和PreTranslateMessage都捕获不到;如果SendMessage是向其它线程或其它进程的窗口发消息,则消息进入消息队列,GetMessage和PreTranslateMessage能捕获到这个消息。3,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。这点大家应该都明白。4,如果在不同线程内。最好用PostThreadMessage代替PostMessage,他工作的很好,SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作,比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。区别很明显,SendMessage的消息是不进队列的,而PostMessage的需要排队。值得说明的是:虽然一个要进队,一个不进队,但是最终处理消息的地方都一样:都是系统调用窗口过程进行处理(收件人作出反应)。PostThreadMessage用于线程间传递消息,可以发给工作线程,也可以发给UI线程。发给工作线程时,该工作线程必须要有自己的消息处理函数。PostMessage用于发给UI线程,需要指定窗口句柄。windows消息处理机制是这种: 首先系统(也就是windows)把来自硬件(鼠标,键盘等消息)和来自应用程序的消息 放到一个系统消息队列中去. 而应用程序须要有自己的消息队列,也就是线程消息队列,每个线程有自己的消息队列,对于多线程的应用程序就有和线程数目相等的线程消息队列. windows消息队列把得到的消息发送到线程消息队列,线程消息队列每次取出一条消息发送到指定窗体,不断循环直到程序退出.这个循环就是靠消息环(while(GetMessage()) TranslateMessage();DispatchMessage();实现的.GetMessage()仅仅是从线程消息中取出一条消息,TranslateMessage()把virtue key消息转化成character消息,如VK_F1会转化成WM_HELP,而DispatchMessage 则把取出的消息发送到目的窗体.假设收到WM_CLOSE消息则结束循环,发送postqiutmessage(0),处理WM_DESTROY销毁窗体!while (GetMessage(&msg, NULL, 0, 0)) //C++ code { TranslateMessage(&msg); DispatchMessage(&msg);}
1、MFC项目场景如下:主线程新建了子线程:CWinThread *m_pThread_SysReset;m_pThread_SysReset= AfxBeginThread(ThreadSysReset this);主界面等待子线程退出时,主线程主动调用了函数:WaitForSingleObject(m_pThread_SysReset->m_hThread, INFINITE);目的是让子待线程安全退出,但是子线程此时正在执行SendMesage发消息函数,主线程就会卡死。而如果子线程改为PostMessage发就不会卡死。为什么呢?原来在工作线程中使用了SendMesage,它是阻塞方式发消息,这样的话在主线程中使用了waitforSingleObject,主线程就会被阻塞,要是工作线程也使用了消息循环与主线程相关的操作,那么因为主线程已经被阻塞了,所以子线程得不到相应,那么就出现假死了。实际上,我们可以不使用WaitForSingleObject,因为MFC主线程在不被关闭的话是不会结束的,所以不能使用WaitForSingleObject这样的函数进行等待。但是很多情况下,我们又需要知道我们创建的工作线程的情况,所以还是需要了解工作线程的返回值。那么我们可以使用微软提供的另一个函数MsgWaitForMultipleObjects。2、怎么解决SendMessage死机问题?使用以下源码即可解决!不再使用WaitForSingleObject,而是使用MsgWaitForMultipleObjects函数。如此一来,无论子线程怎么发消息,SendMessage也好,PostMessage也罢,都OK!m_pThread_SysReset = ThreadFun_StartRun(&m_pThread_SysReset, ThreadSystemReset, this); void CViewImage::ThreadFun_ExitThread(void) m_bExit = true; ThreadFun_WaitForObject(&m_pThread_SysReset);//等待线程退出 CWinThread *CViewImage::ThreadFun_StartRun(CWinThread **pThread, AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority) if (*pThread != NULL) delete *pThread; *pThread = NULL; //启动线程,初始为挂起状态 *pThread = AfxBeginThread(pfnThreadProc, pParam, nPriority, 0, CREATE_SUSPENDED); if (*pThread != NULL) //线程结束时不自动撤销 (*pThread)->m_bAutoDelete = FALSE; //恢复线程运行 (*pThread)->ResumeThread(); return *pThread; void CViewImage::ThreadFun_WaitForObject(CWinThread **pThread) if (*pThread == NULL) return; while (1) DWORD result; MSG msg; result = MsgWaitForMultipleObjects(1, &(*pThread)->m_hThread, FALSE, INFINITE, QS_ALLINPUT); if (result == WAIT_OBJECT_0 + 1) //响应windows消息 PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); TranslateMessage(&msg); DispatchMessage(&msg); //线程运行结束(result==WAIT_OBJECT_0) || //传递了一个无效的句柄(result==WAIT_FAILED) || //线程等待时间已到(result==WAIT_TIMEOUT) || //其他情况(...) break; delete *pThread; *pThread = NULL;
应用场景是:绘制一个运动小球,在大屏幕滚动,屏幕背景图也是一个自定义绘制的(填充色,线条和文字等组成)。如图所示。红色是小球,在大背景里动态移动,而背景是静态的,静止不动。1、MFC克服C++窗体重绘时的闪烁问题,用到的技巧是双缓冲。双缓冲原理网上的文章好多,这里不赘述。//---------------------------------MFC双缓冲//--------------------------------- void CViewImage::OnPaint() CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CFormView::OnPaint() OnPrepareDC(&dc); OnDraw(&dc); //调用了OnDraw void CViewImage::OnDraw(CDC *pDC) CDC dcMemory; //图形重绘,双缓冲防止闪屏 CRect rect; GetClientRect(&rect); CBitmap bmp; dcMemory.CreateCompatibleDC(pDC); bmp.CreateCompatibleBitmap(pDC, rect.right, rect.bottom); CBitmap *pOldBitmap = dcMemory.SelectObject(&bmp); dcMemory.SetBkMode(TRANSPARENT); DrawBackgroundImage(&dcMemory);//绘制自定义背景图 DrawBall(&dcMemory);//绘制小球 pDC->BitBlt(rect.left, rect.top, rect.right, rect.bottom, &dcMemory, 0, 0, SRCCOPY); dcMemory.SelectObject(pOldBitmap); dcMemory.DeleteDC(); bmp.DeleteObject(); BOOL CViewImage::OnEraseBkgnd(CDC* pDC) //Invalidate(FALSE)不擦除背景,直接画,它只会向消息队列中添加了WM_PAINT消息。 //Invalidate(TRUE)擦除背景,它会向消息队列中添加了WM_ERASEBKGND和WM_PAINT两个消息。 //可见:Invalidate(FALSE)不会清空之前所画图像。 //如果你想用Invalidate(TRUE)来实现Invalidate(FALSE)一样的效果, //你可以添加对WM_ERASEBKGND消息响应的函数, //修改OnEraseBkgnd函数的返回值为:return TRUE; //返回值return TRUE就是不擦除背景,此时Invalidate(TRUE)与Invalidate(FALSE)的效果是一样的。 return TRUE;//禁止背景重绘; true表示已处理背景刷新,false表示需要在OnPaint里处理 //return CFormView::OnEraseBkgnd(pDC); }2、本文要解决的是提升绘图效率,不要让背景频繁擦除。本方法可以认为是MFC三缓冲绘图。(#^.^#)在上面的源码OnDraw函数中,每次都需要绘制自定义背景图和小球图。每隔50毫秒通过Invalidate函数发送WM_PAINT消息刷新屏幕。但实际运行过程中发现,每次绘制自定义背景太占CPU(4%,4核CPU),有什么更好的办法吗?办法就是不要每次都重绘背景图,因为它是静止不动的。于是想到将背景预先绘制到一个内存设备区域,然后在OnDraw中将该内存设备环境中的内容复制到当前的内存设备环境中。方法1:画在已知的内存型bmp//---------------------------------方法1:--------------------------------- 定义类的成员变量 CDC dcMemory;//图形重绘,双缓冲防止闪屏 CBitmap bmp; CBitmap *pOldBitmap; void CViewImage::initBackgroundImage(CDC* pDC) if (!bFirst) return; CRect rect; GetClientRect(&rect); dcMemory.CreateCompatibleDC(pDC); bmp.CreateCompatibleBitmap(pDC, rect.right, rect.bottom); pOldBitmap = dcMemory.SelectObject(&bmp); dcMemory.SetBkMode(TRANSPARENT); //dcMemory.FillSolidRect(0, 0, rect.right, rect.bottom, RGB(255, 255, 255));//默认是黑色 DrawBackgroundImage(&dcMemory);//绘制自定义背景图 void CViewImage::destroyBackgroundImage() dcMemory.SelectObject(pOldBitmap); dcMemory.DeleteDC(); bmp.DeleteObject(); void CViewImage::OnDraw(CDC* pDC)//方法1:画在已知的内存型bmp initBackgroundImage(CDC* pDC);//使用布尔量控制只绘制一次,但是遇到OnSize消息时,背景图需要重绘 CRect rect; GetClientRect(&rect); CDC dcCompatible; dcCompatible.CreateCompatibleDC(pDC); pOldBitmap = dcCompatible.SelectObject(&bmp); DrawBall(&dcCompatible);//绘制小球 pDC->BitBlt(rect.left, rect.top, rect.right, rect.bottom, &dcCompatible, 0, 0, SRCCOPY); dcCompatible.SelectObject(pOldBitmap); dcCompatible.DeleteDC(); }方法2:一个CDC拷贝到另一个CDC//---------------------------------方法2:--------------------------------- 定义类的成员变量 CDC dcMemory1; CBitmap bmp1; CBitmap *pOldBitmap1; void CViewImage::initBackgroundImage(CDC* pDC) if (!bFirst) return; CRect rect; GetClientRect(&rect); dcMemory1.CreateCompatibleDC(pDC); bmp1.CreateCompatibleBitmap(pDC, rect.right, rect.bottom); pOldBitmap1 = dcMemory1.SelectObject(&bmp1); dcMemory1.SetBkMode(TRANSPARENT); //dcMemory1.FillSolidRect(0, 0, rect.right, rect.bottom, RGB(255, 255, 255));//默认是黑色 DrawBackgroundImage(&dcMemory1);//绘制自定义背景图 void CViewImage::destroyBackgroundImage() dcMemory1.SelectObject(pOldBitmap1); dcMemory1.DeleteDC(); bmp1.DeleteObject(); void CViewImage::OnDraw(CDC* pDC) initBackgroundImage(CDC* pDC);//使用布尔量控制只绘制一次,但是遇到OnSize消息时,背景图需要重绘 //方法2:一个CDC拷贝到另一个CDC CDC dcMemory2; dcMemory2.CreateCompatibleDC(&dcMemory1); CBitmap bmp2; bmp2.CreateCompatibleBitmap(&dcMemory1, rect.right, rect.bottom); CBitmap *pOldBitmap2 = dcMemory2.SelectObject(&bmp2); dcMemory2.SetBkMode(TRANSPARENT); dcMemory2.BitBlt(rect.left, rect.top, rect.right, rect.bottom, &dcMemory1, 0, 0, SRCCOPY);//CDC拷贝 DrawBall(&dcMemory2);//绘制小球 pDC->BitBlt(rect.left, rect.top, rect.right, rect.bottom, &dcMemory2, 0, 0, SRCCOPY);//绘制在客户区 dcMemory2.SelectObject(pOldBitmap2); dcMemory2.DeleteDC(); bmp2.DeleteObject(); }推荐使用方法2!!---题外话---//---------------------------------题外话:外部加载位图并显示---------------------------------void CViewImage::OnDraw(CDC* pDC) CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP_DEBUG_TEACH); BITMAP bmp1; bitmap.GetBitmap(&bmp1); CDC dcCompatible; dcCompatible.CreateCompatibleDC(pDC); pOldBitmap = dcCompatible.SelectObject(&bitmap); dcCompatible.MoveTo(1, 1); dcCompatible.LineTo(40, 50); pDC->BitBlt(rect.left, rect.top, rect.right, rect.bottom, &dcCompatible, 0, 0, SRCCOPY); dcCompatible.SelectObject(pOldBitmap); dcCompatible.DeleteDC(); bitmap.DeleteObject(); }---参考文献:https://www.cnblogs.com/renyuan/p/3474802.htmlhttps://bbs.csdn.net/topics/390929456https://blog.csdn.net/ooyyee11/article/details/7600625https://www.cnblogs.com/lujin49/p/4704795.html
Detected memory leaks!Dumping objects ->f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {4873} normal block at 0x069959A0, 26 bytes long. Data: 78 C5 9C 0F 09 00 00 00 09 00 00 00 01 00 00 00 {97} client block at 0x003F9D30, subtype c0, 64 bytes long.f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dumpcont.cpp(23) : atlTraceGeneral - a CDynLinkLibrary object at $003F9D30, 64 bytes longf:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dumpcont.cpp(23) : atlTraceGeneral - a CDynLinkLibrary object at $003F9D30, 64 bytes longObject dump complete.内存泄露的原因:BOOL CSmartApp::InitInstance(){m_hLangDLL = ::LoadLibrary(_T("LangEnglish.dll"));}没有释放动态库。int CSmartApp::ExitInstance(){if (NULL != m_hLangDLL){ AfxFreeLibrary(m_hLangDLL);//不可使用::FreeLibrary()函数,会内存泄露
VC++开发会用到toolbar,在没有美工的时候,大部分时间我们只能自己上。传统的工具栏制作软件有:tbcreator和visual toolbar,但是都不好用。这里推荐Axialis IconWorkshop,软件官网:https://www.axialis.com/download/它是一款专业易用功能强大的图标全能软件。IconWorkshop 支持对Windows/Mac/Unix/Android/iOS等系统的图标进行编辑、设计、提取、转换和管理等操作。由于其支持最新的Alpha通道,所以你可以为你的图标添加平滑、阴影、边框等专业效果。Axialis IconWorkshop 支持打开几乎所有格式的图片文件,你可以将图片进行优化后轻松的转换为图标格式。它全面支持对于Windows Vista / 7 PNG压缩图标格式等等。总之,无论你是专业或非专业设计人员,你都可以使用Axialis IconWorkshop在几分钟内设计出漂亮的图标。最重要的是,该软件有用于工具栏的图像带设计功能,如图所示:---题外话---精品推荐 -- ico图标下载https://icons8.com/https://www.easyicon.net/https://www.axialis.com/icons/https://ico.ooopic.com/https://www.microsoft.com/en-us/download/details.aspx?id=35825————————————————版权声明:本文为CSDN博主「libaineu2004」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/libaineu2004/article/details/89966855
CString str; CStringArray array; GetPrivateProfileString(_T("策略参数"), _T("ROI1"), _T(""), str.GetBuffer(MAX_PATH), MAX_PATH, m_strPathROI); //CString的GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能 str.ReleaseBuffer();//千万不能缺少 int size = splitString(str, ',', array); if (size != 4) return FALSE; GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能。是否需要在GetBufer后面调用ReleaseBuffer(),是根据你的后面的程序是否需要继续使用该字符串变量,并且是否动态改变其长度而定的。不是什么好地编程习惯,之类的原因。如果你GetBuffer以后程序自函数就退出,局部变量都不存在了,调用不掉用ReleaseBuffer没什么意义了。对一个CString变量,你可以使用的唯一合法转换符是LPCTSTR,直接转换成非常量指针(LPTSTR-[const] char*)是错误的。正确的得到一个指向缓冲区的非常量指针的方法是调用GetBuffer()方法。
我使用的是OpenCV 2.4.13.6版本。折腾半天,最后把dll库项目的属性,C/C++,代码生成,运行库:多线程调试(/MTd)改为多线程DLL调试(/MDd)就好了。即:在UI项目,配置属性->常规->MFC的使用中,选择共享DLL中使用MFC;在算法dll库项目,Debug,配置属性->C/C++->代码生成->运行库中,选择多线程DLL调试(/MDd)。大概原因:通过对出现的错误:__acrt_first_block == header可以大致的知道是堆内存出现的问题,堆区一般都是用来申请分配动态数组时才会使用,而申请动态数组用的最多的就是使用关键字new[]进行申请分配。而我在程序中并未使用new,哪来的堆区的使用呢,通过查找资料了解到vector可以动态分配内存,因此问题极可能就出现在这上面。--------------------------------------------------------end------------------------------------------------------网上也有很多文章说手动分配内存,办法我也试过,在我这没效果。vector<Vec4i>hierarchy(10000);vector<Mat>contours(10000);//手动分配内存空间大小findContours(Dst, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);//注意,内存空间不已设置过大,否则也会导致程序崩溃.**---参考文献https://blog.csdn.net/auto1993/article/details/52694521https://bbs.csdn.net/topics/391015107
这个问题曾经在TechEd大会上被专门提到。微软说,的确有无数的开发者提议微软开发64bit的Visual Studio,但是微软没有这么做,是因为微软调查了绝大多数的深层需求,他们之所以期待64bit的Visual Studio,是因为他们认为64bit的程序可能拥有更高的性能。但是实际上不是这么回事,64bit程序在x86-64处理器上并不会带来明显的性能提高,它只是增加了处理器的寻址范围,可以使用更大的内存。而对于VS这种并非内存敏感的程序,并不十分需要迁移到64bit下。另外,还有一个历史原因,就是微软一直没有完成64bit下的JIT调试器的Edit and Continue功能,这是因为64bit的JIT是C++团队做的,和原生CLR团队的32bit JIT有很多不同,微软现在正在试图统一两者。如果微软推出了64bit的VS,那么调试的体验会受到限制,这也是为什么微软一直以来没有推出64bit VS的原因。
2019/10/26笔者注:使用WinRAR命令行工具不是最优的方案,还有更好更简易的方案,请访问我的另一篇文章推荐Total Commander工具:可以实现VS/Qt工程源码的一键备份VC++项目需要备份,如果里面有较大的目录和文件(如debug/Release目录和.ncb/.pdb文件)时,就需要先删除。但是删除临时文件以后又要重新编译,比较麻烦。有没有更便捷的方式呢?上网查资料,查看winrar的帮助文件。大体的方案如下:1、建立一个“备份文件列表”。列入所有要备份的文件和目录的名称。2、建立一个快捷方式,指向winrar的绝对路径,然后加上命名行参数。3、查看帮助文件知道,我们还可以指定一个“忽略文件列表”,指定哪些文件不必备份。方法1:CMD命令行,注意64位和32位的WinRAR安装路径不同"C:\Program Files\WinRAR\Rar.exe" a -u -r test.rar @list_append.txt -x@list_ignore.txt执行程序可以是WinRar.exe,也可以是Rar.exea:表示进行的是压缩动作-u:进行更新式的备份-r:备份所有子目录test.rar:目标文件-x@<lf> 排除指定文件列表中列出的文件。如果您使用 -x@ 而没有列表文件名参数,它会从标准输入设备读取文件名。此外,需要程序员手动写以下这两个文件:list_append.txtMFCApplication1list_ignore.txtMFCApplication1\DebugMFCApplication1\MFCApplication1\Debug请注意:(1)路径的斜杆不能写错,正确是“\”,而不是"/"。因为在DOS命令中使用反斜杠“\”作为分隔符。写错了会执行失败。(2)list_append.txt的扩展名无所谓,可以是.txt,也可以是.lst,效果一样的。方法2:js脚本,直接鼠标双击即可运行(推荐)(1)BackupList.js,自动生成list_append.txt和list_ignore.txt,注意js脚本有oRet = oName.replace(/\//g, "\\");这句话,目的是把正斜杠转换成反斜杠。因为在DOS命令中使用反斜杠“\”作为分隔符。写错了会执行失败。/* 初始化备份列表.js说明: 1、自动收集当前目录下的所有目录和文件,将需要备份的放入“list_append.txt”,不需要备份的放入“list_ignore.txt”。 "list_append.txt"包含要备份的文件(目录)列表 "list_ignore.txt"包含要忽略的文件(目录)列表2、进行匹配的“正则表达式”,默认的支持VC++项目的备份。3、对于其他项目,可根据需要自行修改“正则表达式”(reFile/rePath)。4、也可以直接修改已生成的"list_append.txt"和"list_ignore.txt"。5、当前的“正则表达式”指示不备份以下目录和文件: 例如所有名含有"debug/release"的目录, 例如所有后缀名为".rar/.zip/.ncb/.pdb/.ilk"的文件。更新地址:https://blog.csdn.net/libaineu2004/article/details/89811454版本修改历史:1.0: - 初始版本*/ var WshShell = new ActiveXObject("WScript.Shell"); //当前目录 var oCurrentDirectory = WshShell.CurrentDirectory; var fso = new ActiveXObject("Scripting.FileSystemObject"); var folder = fso.GetFolder(oCurrentDirectory); //准备两个文件 var oListAppend = fso.CreateTextFile(oCurrentDirectory + "/list_append.txt", true, true); var oListIgnore = fso.CreateTextFile(oCurrentDirectory + "/list_ignore.txt", true, true); //关于“忽略”的正则表达式 var reFile = /(.rar$)|(.zip$)|(.ncb$)|(.pdb$)|(.ilk$)|(.exp$)|(.obj$)|(.pch$)|(.idb$)|(.res$)|(.manifest$)|(.suo$)|(.js$)|(.user$)|(.log$)|(leak_report.txt$)/i; var rePath = /halcon|opencv|.tlog$|ImageSource$|.vs/i; //检索目录 _LookupFolder("", folder, true); //close oListAppend.close(); oListIgnore.close(); WshShell.Popup("Congratulations, initialization is complete!", 0, "https://blog.csdn.net/libaineu2004", 0); function _LookupFolder(oRelativePath, oFolder, bAppend) { if (oFolder) { var oRet; //files var oFiles = new Enumerator(oFolder.files); for (; !oFiles.atEnd(); oFiles.moveNext()) { var oName = oRelativePath + oFiles.item().name; if (_checkFileName(oName)) { oRet = oName.replace(/\//g, "\\"); oListIgnore.WriteLine(oRet); } else { //因为父目录已加入,所以文件不必加入。 if (bAppend) { oRet = oName.replace(/\//g, "\\"); oListAppend.WriteLine(oRet); //subfolders var oSubFolders = new Enumerator(oFolder.subFolders); for (; !oSubFolders.atEnd(); oSubFolders.moveNext()) { var oSubFolder = oSubFolders.item(); var oName = oRelativePath + oSubFolder.name; if (_checkPathName(oName)) { oRet = oName.replace(/\//g, "\\"); oListIgnore.WriteLine(oRet); } else { //因为父目录已加入,所以子目录不必加入。 if (bAppend) { oRet = oName.replace(/\//g, "\\"); oListAppend.WriteLine(oRet); //检测子目录 _LookupFolder(oName + "/", oSubFolder, false); function _checkFileName(oName) { return reFile.test(oName); function _checkPathName(oName) { return rePath.test(oName); }(2)BackupRun.js,自动打包备份/* 执行备份.js 1、自动执行winrar.exe程序 2、"list_append.txt"包含要备份的文件(目录)列表 3、"list_ignore.txt"包含要忽略的文件(目录)列表 4、默认采用的是更新备份的方式。 5、可针对不同的实际应用自行修改命令行的开关值(oSwitch)。 更新地址:https://blog.csdn.net/libaineu2004/article/details/89811454 版本修改历史: 1.0: - 初始版本 var WshShell = new ActiveXObject("WScript.Shell"); //取得加入列表文件的完整路径 var oListAppendPath = _getListAppendPath(); //取得忽略列表文件的完整路径 var oListIgnorePath = _getListIgnorePath(); //检测列表文件是否已初始化 if (!_checkFileExist(oListAppendPath, oListIgnorePath)) { WshShell.Popup("Please execute first BackupList.js!", 0, "https://blog.csdn.net/libaineu2004", 0); } else { //取得winrar.exe的完整路径 var oRarPath = WshShell.RegRead("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\WinRAR.exe\\"); //取得目标文件名 var oRarTarget = _getTargetPath(); //指令/开关 var oAction = " a "; var oSwitch = " -u -r "; //组合命令行参数 var oCommand = "\"" + oRarPath + "\"" + oAction + oSwitch + "\"" + oRarTarget + "\"" + " @" + "\"" + oListAppendPath + "\""; oCommand += " -x@" + "\"" + oListIgnorePath + "\""; if (6 == WshShell.Popup("If you start backing up now, click 'Yes'!", 0, "https://blog.csdn.net/libaineu2004", 4)) { //WshShell.Popup(oCommand, 0, "cmd", 0); var oExec = WshShell.Exec(oCommand); function _checkFileExist(oListAppendPath, oListIgnorePath) { try { var fso = new ActiveXObject("Scripting.FileSystemObject"); fso.GetFile(oListAppendPath); fso.GetFile(oListIgnorePath); } catch (e) { return false; return true; function _getListAppendPath() { var oCurrentDirectory = WshShell.CurrentDirectory; return oCurrentDirectory + "\\list_append.txt"; function _getListIgnorePath() { var oCurrentDirectory = WshShell.CurrentDirectory; return oCurrentDirectory + "\\list_ignore.txt"; function _getTargetPath() { var oCurrentDirectory = WshShell.CurrentDirectory; var n = oCurrentDirectory.lastIndexOf("\\"); return oCurrentDirectory + oCurrentDirectory.substr(n) + ".rar"; }2019/10/26笔者注:使用WinRAR命令行工具不是最优的方案,还有更好更简易的方案,请访问我的另一篇文章推荐Total Commander工具:可以实现VS/Qt工程源码的一键备份---参考文献https://blog.csdn.net/pimshell/article/details/1633607https://blog.csdn.net/pimshell/article/details/1633610
Visual Leak Detector(以下简称:VLD) 是一个著名的 C/C++ 程序内存泄漏检测插件,而且还是免费且开源的。现在最新版本的 VLD v2.5.1 官方并不支持 Visual Studio 2017,只支持 Visual Studio 2008 到 Visual Studio 2015。https://kinddragon.github.io/vld/https://github.com/KindDragon/vldhttps://github.com/KindDragon/vld/releases -- 安装包下载https://www.cnblogs.com/starfire86/p/5594707.html -- 使用说明https://blog.csdn.net/chaipp0607/article/details/79182471 -- 内存泄漏工具Visual Leak Detector2.5.1安装与使用★编译源码最新版本的 VLD v2.5.1 官方并不支持 Visual Studio 2017,只支持 Visual Studio 2008 到 Visual Studio 2015。笔者使用的是VS2017环境,所以从官网下载https://github.com/KindDragon/vld/releases v2.5.1源码,自己编译,不使用官网的vld-2.5.1-setup.exe。1、VS2017打开工程vld_vs14.sln2、编译之前,把所有子项目的平台工具集选择“Visual Studio 2015 (v140)”★注意事项:*0、(非必须)源码修改\vld-2.5.1\src\utility.cpp,第721行开始,把原来的wcstombs_s函数替换为WideCharToMultiByte。因为wcstombs_s不支持中文字符,需要设置Locale参数,setlocale(LC_ALL,"chs");用起来啰嗦还容易出错,故而替换之。const size_t MAXMESSAGELENGTH = 5119; size_t count = 0; CHAR messagea [MAXMESSAGELENGTH + 1]; //firecat add // wcstombs_s requires locale to be already set up correctly, but it might not be correct on vld init step. So use WideCharToMultiByte instead //把Unicode文本转换为ANSI count = WideCharToMultiByte(CP_ACP, 0, messagew, -1, NULL, 0, NULL, NULL); memset(&messagea, 0, MAXMESSAGELENGTH + 1); WideCharToMultiByte(CP_ACP, 0, messagew, -1, messagea, count, NULL, NULL); if (wcstombs_s(&count, messagea, MAXMESSAGELENGTH + 1, messagew, _TRUNCATE) != 0) { // Failed to convert the Unicode message to ASCII. assert(FALSE); return; messagea[MAXMESSAGELENGTH] = '\0';1、难道VLD真的不支持 Visual Studio 2017 吗?其实并非如此。以下是解决办法:我的 Visual Studio 2017 的安装路径为:C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise从以下目录中:C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\Cpp拷贝(覆盖)\dbghelp.dll 到 <项目文件夹>\Visual_Leak_Detector\bin\Win32拷贝(覆盖)\x64\dbghelp.dll 到 <项目文件夹>\Visual_Leak_Detector\bin\x64再以 Debug 模式运行该程序,在 output 窗口中可以看到详细的内存泄漏信息。2、VS2017调试程序时,除了使用VS2017安装路径自带的dbghelp.dll文件,还需要Microsoft.DTfW.DHL.manifest文件,该文件在VLD源码包,路径是\vld-2.5.1\setup\dbghelp\x86和x64文件夹。Microsoft.DTfW.DHL.manifest文件很重要,没有它可不行,否则调试或运行时会报错。3、接下来需要将VLD加入到自己的代码中。方法很简单,只要在包含入口函数的.cpp文件中包含vld.h就可以。如果这个cpp文件中包含了stdafx.h,则将包含vld.h的语句放在stdafx.h的包含语句之后,否则放在最前面。'#include <vld.h>' should appear before '#include <afxwin.h>' in file stdafx.h断点调试程序时,把文件vld.ini放在和.vcxproj工程文件一起的路径下。发布程序时,把文件vld.ini放在和应用程序exe文件一起的路径下。4、如何在Release版本下使用VLD?请参考https://www.jianshu.com/p/1fb05cfdc76d,方法有2种:方法(1)打开安装路径下的vld.ini文件,将ReportTo设置为both,为了在非bebug下也能看到检测结果方法(2)宏定义:#define VLD_FORCE_ENABLE; Sets the report file destination, if reporting to file is enabled. A relative; path may be specified and is considered relative to the process' working; directory.;; Valid Values: Any valid path and filename.; Default: .\memory_leak_report.txt;ReportFile = .\memory_leak_report.txt; Sets the report destination to either a file, the debugger, or both. If; reporting to file is enabled, the report is sent to the file specified by the; ReportFile option.;; Valid Values: debugger, file, both; Default: debugger;ReportTo = both5、包含顺序(1)对于非MFC工程,如有有 #include "stdafx.h" 的话,一定要把 "vld.h" 放在 stdafx.h之后包含。#include "stdafx.h"#include <vld.h>(2)对于MFC工程,包含vid.h需要在包含afxwin.h之前#include <vld.h>#include <afxwin.h>6、该工具只能检测堆(Heap)上分配的内存泄漏,不能检测VirtualAlloc(Private Data)申请的内存泄漏。7、使用总结和举例:附加包含目录添加C:\Program Files (x86)\Visual Leak Detector\include附加库目录添加C:\Program Files (x86)\Visual Leak Detector\lib\Win64附加依赖项添加vld.lib支持release的方法1:将vld.ini中的ReportTo修改为both方法2:宏定义#define VLD_FORCE_ENABLE#include "stdafx.h" #define VLD_FORCE_ENABLE //VLD_FORCE_ENABLE宏定义是为了Release版本也能生成报告 #include <vld.h> int _tmain(int argc, _TCHAR* argv[]) VLDGlobalEnable(); VLDReportLeaks(); char *strTest = new char[1024]; sprintf(strTest,"111111"); printf(strTest); VLDGlobalDisable(); return 0; }MFC:在stdafx.h文件最前面写:#define VLD_FORCE_ENABLE//让release支持vld #include <vld.h>//VLD要放在最前面 #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define VC_EXTRALEAN #define VLD_FORCE_ENABLE//让release支持vld #include <vld.h>//VLD要放在afxwin.h前面 #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> // MFC support for Windows Common Controls #endif // _AFX_NO_AFXCMN_SUPPORT★我个人实现的VS2017项目源码和dll库请下载https://download.csdn.net/download/libaineu2004/12118513★VLD请谨慎使用,有时候会误报。建议还是掌握windbg调试方法:《VC++内存泄漏检测方法(5):使用强大的Windbg工具,重点是Symbols Path设置》---参考文献---其他内存检测工具:MallocDebug,purify, Valgrind,Kcachegrind,dmalloc,NuMega,BoundsChecker,ParaSoft ,Insure++等等。Visual Leak Detector on Visual C++ 2017
原本想生成dll文件后,自动拷贝到指定的路径,结果编译报错:1>syAve.vcxproj -> D:\My Resources\Hello World\测试\Smer 2019.4.28\Debug\syAve.dll1>系统找不到指定的文件。1>系统找不到指定的文件。1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(132,5): error MSB3073: 命令“copy D:\My Resources\Hello World\测试\Smer 2019.4.28\Debug\syAve.lib ..\Smer\Lib\Debug1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(132,5): error MSB3073: copy D:\My Resources\Hello World\测试\Smer 2019.4.28\Debug\syAve.dll ..\Smer\Lib\Debug1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(132,5): error MSB3073: 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(132,5): error MSB3073: :VCEnd”已退出,代码为 1。原因是:copy命令不支持路径带空格。(备注:中文是支持的。)解决办法是:路径加引号!
AStyle Extension 2017https://marketplace.visualstudio.com/items?itemName=Lukamicoder.AStyleExtension2017IncrediBuild分布式联合编译https://marketplace.visualstudio.com/items?itemName=vs-publisher-1193210.IncrediBuild3、目前暂不用,留着将来时Color Theme Editor for Visual Studio 2017https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.VisualStudio2017ColorThemeEditorGitHub Extension for Visual Studio: 源码版本管理https://marketplace.visualstudio.com/items?itemName=GitHub.GitHubExtensionforVisualStudioVisual Studio IntelliCode - Preview,微软新出的AI辅助开发,可根据代码上下文智能提示出你可能需要的代码https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.VSIntelliCodeWiX Toolset Build Tools: 安装打包工具https://marketplace.visualstudio.com/items?itemName=RobMensching.WiXToolsetBuildVision : 使用可视化的编译输出替代文字输出,提供编译期间一些快捷的干预按钮https://marketplace.visualstudio.com/items?itemName=stefankert.BuildVisionMicrosoft Child Process Debugging Power Toolhttps://marketplace.visualstudio.com/items?itemName=vsdbgplat.MicrosoftChildProcessDebuggingPowerToolVSDebugProhttps://marketplace.visualstudio.com/items?itemName=OvidiuIonescu.VSDebugToolDeleakerhttps://marketplace.visualstudio.com/items?itemName=Softanics.DeleakerRedis Explorerhttps://marketplace.visualstudio.com/items?itemName=MohsenKokabi.RedisExplorer-13503OpenCV Managerhttps://marketplace.visualstudio.com/items?itemName=havendv.opencv-managerCMake Project Wizardshttps://marketplace.visualstudio.com/items?itemName=oOFlorianOo.CMakeProjectWizardsCodeBeautifier: 格式化排版工具https://marketplace.visualstudio.com/items?itemName=MariuszBrzeski.CodeBeautifierActipro Icons - Royalty-free images for appshttps://marketplace.visualstudio.com/items?itemName=ActiproSoftware.ActiproIcons-Royalty-freeimagesforappsJSON Viewerhttps://marketplace.visualstudio.com/items?itemName=MykolaTarasyuk.JSONViewerGhostDoc Community for VS2017 : 从代码生成XML注释,维护干净和最新的文档,生成多种格式的帮助文档,在Visual Studio中使用智能源代码拼写检查器。https://marketplace.visualstudio.com/items?itemName=sergeb.GhostDoc4、弃用Output enhancer,个人感觉没有VSColorOutput好用,所以弃用https://marketplace.visualstudio.com/items?itemName=NikolayBalakin.OutputenhancerCSS Tools,个人喜好sublime_text+ColorHighlight插件,所以弃用https://marketplace.visualstudio.com/items?itemName=MadsKristensen.CSSToolsCode Compare,个人喜好Beyond Compare 3.3.13,所以弃用https://marketplace.visualstudio.com/items?itemName=DevartSoftware.CodeCompareReSharper C++,功能强大,但是据说很耗内存,所以弃用https://marketplace.visualstudio.com/items?itemName=JetBrains.ReSharperCTabs Studio : a Visual Studio extension empowering you to work comfortably with any number of open documents.个人喜好Custom Document Well,所以弃用https://tabsstudio.com/index.htmOpen in Sublime Text : 右键菜单新增,用sublimeText打开文件,因为Open in Editor 2017插件更好,所以弃用https://marketplace.visualstudio.com/items?itemName=MadsKristensen.OpeninSublimeTexthttps://github.com/madskristensen/OpenInSublimeTextOpen in Notepad++ :右键菜单新增,用Notepad打开文件,因为Open in Editor 2017插件更好,所以弃用https://marketplace.visualstudio.com/items?itemName=CalvinAAllen.OpeninNotepad5、如何清理全部插件,恢复出厂值?先手动删除文件夹,这些都是临时文件夹,尽管放心删除C:\Users\firecat\AppData\Local\CodeMaidC:\Users\firecat\AppData\Local\Microsoft\VisualStudioC:\Users\firecat\AppData\Local\Microsoft\VisualStudio ServicesC:\Users\firecat\AppData\Local\Microsoft\VSApplicationInsightsC:\Users\firecat\AppData\Local\Microsoft\VSCommonC:\Users\firecat\AppData\Local\Microsoft\VisualStudio\15.0_aab79776\Extensions\53zltn4j.0qi -- VC助手C:\Users\firecat\AppData\Roaming\CppcheckVisualStudioAddInC:\Users\firecat\AppData\Roaming\Microsoft\VisualStudioC:\Users\firecat\AppData\Roaming\VisualAssistC:\Users\firecat\AppData\Roaming\VSColorOutput再删除注册表信息HKEY_CURRENT_USER\Software\Whole Tomato另外,如果安装了Halcon图像处理插件,它的安装路径是:C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Extensions\22zr3ldu.v516、定期清理VC助手的临时文件临时文件默认存放在:C:\Users\firecat\AppData\Local\Microsoft\VisualStudio\15.0_726bcb92\Extensions\blymtzyc.0vg\Data时间久了,文件夹很占空间,可以定期手动删除Data文件夹可通过修改注册表的方式,修改该缓存路径的默认位置。修改方法如下:运行regedit,打开注册表,找到如下地方[HKEY_CURRENT_USER/Software/Whole Tomato]"Logging"="0""UserDataDir"="E://Visual Assist Cache//"如果没有UserDataDir这一项,则新增该项。红色部分内的目录是自己定义的目录,必须手动先建立好。---友情链接:VS2017全部下载后再安装的路径在哪里?安装过程是什么?Visual Studio 2017 版本 15.9 发行说明https://docs.microsoft.com/zh-cn/visualstudio/releasenotes/vs2017-relnoteshttps://visualstudio.microsoft.com/zh-hans/vs/older-downloads/Visual Studio 2019 发行说明https://docs.microsoft.com/zh-cn/visualstudio/releases/2019/release-notesMicrosoft Visual C++ Redistributable,The latest supported Visual C++ downloads:https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
1、VS插件,微软官网https://marketplace.visualstudio.com/https://visualstudio.microsoft.com/zh-hans/vs/features/extend/ -- 扩展 Visual Studio IDE,入门教程https://marketplace.visualstudio.com/publishers/Microsoft%20DevLabs -- Microsoft DevLabshttps://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.ProductivityPowerPack2017 -- Productivity Power Tools VS2017/VS2019https://github.com/Microsoft/VS-PPT -- Productivity Power Tools VS2017/VS2019源码或者在VS IDE-菜单-工具-扩展和更新-联机,可以搜索找到想要的插件。2、我个人中意的插件Visual Assist:大名鼎鼎的VC助手https://marketplace.visualstudio.com/items?itemName=WholeTomatoSoftware.VisualAssisthttps://www.wholetomato.com/https://me.csdn.net/download/piggyxp -- dll文件CodeMaid : 可快速整理代码文件,清理不必要的代码和杂乱的格式。并在开发时实时提供代码复杂度的报告,以便帮助开发人员降低代码复杂度、提高代码质量。码锹窗口比较实用(#^.^#)https://marketplace.visualstudio.com/items?itemName=SteveCadwallader.CodeMaidhttp://www.codemaid.net/https://github.com/codecadwallader/codemaidQt Visual Studio Tools: VS-Qt插件http://download.qt.io/official_releases/vsaddin/https://marketplace.visualstudio.com/items?itemName=TheQtCompany.QtVisualStudioTools-19123Ctrl+Click Go To Definition (已集成在Productivity Power Tools),方便函数跳转,习惯用QtCreator开发者的福音https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.CtrlClickGoToDefinitionhttps://github.com/Microsoft/VS-PPTCustom Document Well (已集成在Productivity Power Tools),丰富Tab选项卡的功能,方便源码阅读https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.CustomDocumentWellSolution Error Visualizer (已集成在Productivity Power Tools),颜色标记编译之后有错误/警告的源文件和头文件https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.SolutionErrorVisualizerPower Commands for Visual Studio (已集成在Productivity Power Tools),右键菜单新增有打开cmd,打开文件夹等https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.PowerCommandsforVisualStudioTime Stamp Margin (已集成在Productivity Power Tools),断点调试时,会显示每条语句的执行时间https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.TimeStampMarginVSColorOutput (已集成在Productivity Power Tools),输出窗口用不同颜色标记不同信息,下载时请看清楚版本,不同版本对应不同的VS。https://marketplace.visualstudio.com/items?itemName=MikeWard-AnnArbor.VSColorOutputhttps://mike-ward.net/vscoloroutput/https://github.com/mike-ward/VSColorOutputCppcheck add-in : 静态源码检测工具https://marketplace.visualstudio.com/items?itemName=Alexium.Cppcheckadd-inhttps://github.com/danmar/cppcheck -- cppcheck源码https://github.com/danmar/cppcheck/releases -- cppcheck安装包下载https://github.com/VioletGiraffe/cppcheck-vs-addin -- VS插件https://github.com/OneMoreGres/qtc-cppcheck -- QtCreator插件RockMargin : 参考了RockScroll。它是多彩的滚动条,可以在代码编辑器右侧形象的展示出代码的结构,方便快速浏览和定位。用过Sublime Text的同学你懂得^_^https://marketplace.visualstudio.com/items?itemName=K1tty.RockMarginhttps://github.com/K1tty/RockMarginOpen in Editor 2017 : 右键菜单添加一个菜单命令,允许您在文本编辑器中打开任何解决方案,项目,文件夹和文件。https://marketplace.visualstudio.com/items?itemName=JVS.OpeninEditor-18442Image Watch:OpenCV可视化界面插件,确保VS使用的是debug模式,并且在适当的位置设置的断点,调试运行至断点时即可激活image watch插件。如果没有显示Image Watch窗口,可以使用如下方法调用:菜单栏->视图->其他窗口->image watch,调出该插件。VS2012-VS2015https://marketplace.visualstudio.com/items?itemName=VisualCPPTeam.ImageWatchVS2017https://marketplace.visualstudio.com/items?itemName=VisualCPPTeam.ImageWatch2017VS2019https://marketplace.visualstudio.com/items?itemName=VisualCPPTeam.ImageWatch2019ForceUTF8 (with BOM)文件统一使用UTF-8+BOM编码C++ Debugger Visualizers for VS2017一款使C++的可视化调试工具支持Boost, wxWidgets, TinyXML, TinyXML2库的插件,如果你用到了这些库,这个就是一个不可多得的好工具。https://marketplace.visualstudio.com/items?itemName=ArkadyShapkin.CDebuggerVisualizersforVS2017
软件之Dependencies1、微软官方有提供depends,可以查看exe文件的依赖库,仅适用于winxp/win7/win8,但是不能用于win10,会卡死报错. 官网下载:Dependency Walker (depends.exe) Home Page 左上角第一个窗口是Dll信息窗口,显示程序所需的Dll模块。点击一个dll动态链,右边就会出现两个窗口。第一个窗口是所选的Dll模块所使用的函数,分为:序数、提示、函数、入口点等讯息。右边第二个窗口是所选Dll模块的所有的导出函数,也分为:序数、提示、函数、入口点等讯息。2、隆重推荐Dependencies,可以应用在win7/win8/win10,不支持winxp,但还是推荐使用!软件下载:https://github.com/lucasg/Dependencieshttps://github.com/lucasg/Dependencies/releases软件依赖环境:需要下载Microsoft Visual C++ Redistributable,The latest supported Visual C++ downloads:The latest supported Visual C++ downloads最后,运行程序:DependenciesGui.exe3、DLL下载网站:Download missing DLL files for free | DLL‑files.com软件之All Dlls DependenciesAll Dlls Dependencies 是 Dlls 依赖项的静态分析器。它是 Depends 的克隆,支持 Windows 7 和 Windows 10 存根 dll。像 Dependency Walker 一样,它可以分析模块以查找丢失的导入的 dll 或函数http://jacquelin.potier.free.fr/AllDllDeps/如何隐藏DLL中,导出函数的名称?如何隐藏DLL中,导出函数的名称? - nchxmoon - 博客园隐藏DLL函数名字隐藏DLL函数名字_chenqingzhi0728的博客-CSDN博客最简单的DLL导出函数隐藏方式[原创]最简单的DLL导出函数隐藏方式-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com
本人电脑安装了VS2017,但是想用VS2015的编译器,于是去官网下载MSBuild 2015,即Microsoft 生成工具 2015 更新 3。https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/安装完Visual C++ Build Tools 2015,发现VC++的项目属性页都是英文:那怎么把它变成中文呢?方法如下:从微软官网https://docs.microsoft.com/zh-cn/previous-versions/ee662426%28v%3dvs.110%29,了解到:.xml 文件直接支持 IDE,而非 MSBuild。 不过,系统会赋予 IDE 属性值以生成属性和项。大多数 .xml 文件都位于特定于区域设置的子目录中。 例如,针对美国英语区域的文件位于 $(VCTargetsPath)\1033\ 中。中文区域的文件位于2052文件夹。照着这个思路,可以发现C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140目前只有1033文件夹,没有2052文件夹,所以只能显示英文。笔者上传的2052汉化包,请下载:https://download.csdn.net/download/libaineu2004/11147708解压后放在C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140路径下即可。重启VS,最终效果如下:
VS2017早期的版本,安装包缓存目录不可以修改,现在最新版本安装工具可以把缓存保存到其他位置了,(#^.^#)VS2017在下载好安装程序安装的时候,会根据你选择的功能模块来下载所需要的安装程序,而这些安装程序的下载位置默认是放在C:\ProgramData\Microsoft\VisualStudio\Packages目录下,注意ProgramData是隐藏的文件夹。这些安装包占用了大量的C盘空间。所以需要修改路径。早期VS2017不能修改文件路径时,为了解决这个目录问题,采用的方法是欺骗VS2017安装程序,让它误以为文件还放在C:\ProgramData\Microsoft\VisualStudio\Packages目录下。1、我们创建一个真正存储下载文件的文件夹,比如F:\Software\Microsoft Visual Studio\VS2017_Packages。2、手动删除文件夹C:\ProgramData\Microsoft\VisualStudio\Packages,注意ProgramData是隐藏的文件夹。3、然后创建一个链接,链接到C:\ProgramData\Microsoft\VisualStudio\Packages 目录。用管理员权限打开CMD(windows开始菜单-所有程序-附件-命令提示符-右键,以管理员身份运行),输入命令:mklink /D C:\ProgramData\Microsoft\VisualStudio\Packages "F:\Software\Microsoft Visual Studio\VS2017_Packages"命令里面含引号,之所以加引号是因为字符串有空格。最后,附上笔者的安装心得与建议:0、个人推崇使用mklink建立快捷方式,把C:\ProgramData\Microsoft\VisualStudio\Packages引到其他位置。1、VS开始下载,会把安装包放在临时目录,这个是自发行为,我们管不了。例如:C:\Users\<用户名>\AppData\Local\Temp\ca45xquu2、下载完成,安装时,会自发地把\Temp\ca45xquu\的文件全部拷贝到F:\Software\Microsoft Visual Studio\VS2017_Packages3、安装完毕,\Temp\ca45xquu\会自动被删除4、F:\Software\Microsoft Visual Studio\VS2017_Packages要好好保管,千万别删!因为将来相关组件需要在线更新时,还需要用到。另外,千万不要想当然认为可以把VS2017_Packages文件夹拷贝给其他电脑安装,这样是行不通的,因为每台电脑的环境不同,已安的软件不同,依赖库也不同。笔者曾尝试过把台式机电脑上的VS2017_Packages拷贝到笔记本,然后笔记本安装VS2017时会报错,提示找不到C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise路径,安装失败!总之,VS2017_Packages只能留给本机使用!5、C:\ProgramData\Package Cache也不要删除。微软官方表示删除该文件夹可能引起某些软件工作不正常,如Visual Studio。为了给系统盘瘦身,也可以采用mklink加入文件链接的方法,即将系统盘的Program Data/Package Cache目录指向其他位置。mklink /D "C:\ProgramData\Package Cache" "F:\Software\Package Cache"6、VS调试符号文件(.pdb)的设置---参考文章:Visual Studio 2017 版本 15.9 发行说明https://docs.microsoft.com/zh-cn/visualstudio/releasenotes/vs2017-relnoteshttps://visualstudio.microsoft.com/zh-hans/vs/older-downloads/https://blog.csdn.net/w763613202/article/details/69334954Visual Studio 2019 发行说明https://docs.microsoft.com/zh-cn/visualstudio/releases/2019/release-notesvs2017安装和使用教程(详细)https://blog.csdn.net/qq_36556893/article/details/79430133 Microsoft Visual C++ Redistributable,The latest supported Visual C++ downloads:https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads.Net SDK全系列下载,.NET Core和.NET Frameworkhttps://dotnet.microsoft.com/download/visual-studio-sdks
1、Process Explorer和Process Monitor软件下载https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorerhttps://docs.microsoft.com/zh-cn/sysinternals/downloads/procmon下载完,打开Process Explorer软件,菜单->File->Save As,可以把当前运行的进程名称记录在文本。再通过Beyond Compare对比软件查看差异,由此我们可以通过它来分析Visual Studio 2013编译和调试过程中究竟产生了哪些进程。2、打开Visual Studio 2013,后台会产生devenv.exe进程devenv.exe位于C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe3、新建Win32控制台程序,然后编译,编译过程会产生以下进程:MSBuild.exe -- 这个生成编译的发起者,统筹全局mspdbsrv.exe -- Microsoft® Program Databasevcpkgsrv.exe -- Microsoft (R) Visual C++ Package Serverconhost.exe -- win32控制台窗口主机cl.exe -- 真正的编译器,源码编译执行者其中cl.exe位于C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\cl.exe,这个进程生命周期比较短暂,编译完源码,cl进程就会被杀死。MSBuild.exe位于C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe4、调试(1)调试过程会产生以下进程conhost.exe -- win32控制台窗口主机ConsoleApplication1.exe -- 用户程序由此可见,调试使用的是VS自身的进程,没有额外产生其他进程。(2)使用Process Monitor软件来观察:打开软件->菜单->Filter->Filter...->Process Name contains devenv->Add可以观察到,devenv.exe会访问相关文件,例如,这里只截取了部分注册表及文件:HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0_Config\DebuggerHKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0_Config\Debugger\CodeView CompilersHKCU\Software\Microsoft\VisualStudio\12.0\AD7Metrics\Engine......C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\vsdebugeng.impl.DLLC:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\atlmfc.natvis......
网上大量的博客都是讲述如何在高版本的VS使用低版本的编译器,例如电脑已经安装了VS2017,但是不想安装低版本的VS2015/VS2013/VS2010等,同时又想用低版本的编译器。这类的博客实在太多,方法我就不赘述了。然而我的这篇博客......是的,你没有看错标题,就是实现在Visual Studio 2013中使用MSVC 2015编译器!即VS低版本使用高版本编译器!本人的电脑安装了完整版的VS2013,但是没有安装VS2015。如何实现高版本的编译器和调试器呢?以下是实现的过程:一、安装Microsoft Build Tools 20151、Visual Studio的编译引擎是MSBuild,它提供了一套项目文件(.csproj,.vbproj, vcxproj)的XML的Schema,用来指定如何处理和编译项目。MSBuild也是一个MIT License的开源软件,可以在Github上看到它的仓库。当然MSBuild不依赖于Visual Studio,完全可以在不安装Visual Studio的情况下使用MSBuild。在链接 https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/,找到了可再发行组件和生成工具:Microsoft Visual C++ 2015 Redistributable 更新 3Microsoft 生成工具 2015 更新 3我们顺序安装。需要注意的一点是,在安装VS2015的生成工具(即MSBuild)的时候,请选择默认安装,默认的是winSDK 8.1。(但是如果想安装MFC的文件和库文件就需要自定义安装。)visualcppbuildtools_full.exe默认是在线安装,我们也可以设置成离线安装,带上本地磁盘路径:visualcppbuildtools_full.exe /layout d:\vs2015安装完成之后,C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0会有V140文件夹。V120对应的是VS2013;V140对应的是VS2015;在系统盘路径下执行DOS命令,可以查看都安装了哪些MSBuild.exe:C:\>dir /s /b /d MSBuild.exe2、关于MSBuild的微软官方文档:使用命令行中的 MSVC 工具集https://docs.microsoft.com/zh-cn/cpp/build/building-on-the-command-linehttps://docs.microsoft.com/zh-cn/visualstudio/msbuild/msbuildC/C++ 生成参考https://docs.microsoft.com/zh-cn/cpp/build/reference/c-cpp-building-reference3、安装完MSBuild,为什么VC++项目属性页显示的是英文?解决办法请参见我的另一篇博客:https://blog.csdn.net/libaineu2004/article/details/89599523二、将自定义工具集成到项目属性1、新建VS2013 Win32控制台程序,以ConsoleApplication1命名为例:工程建完之后,进入工程所在文件夹,记事本打开(或者直接在工程界面->解决方案->右键菜单->卸载项目->编辑)ConsoleApplication1.vcxproj,修改如下(关注红色字体):<?xml version="1.0" encoding="utf-8"?><Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup Label="ProjectConfigurations"> <ProjectConfiguration Include="Debug|Win32"> <Configuration>Debug</Configuration> <Platform>Win32</Platform> </ProjectConfiguration> <ProjectConfiguration Include="Release|Win32"> <Configuration>Release</Configuration> <Platform>Win32</Platform> </ProjectConfiguration> </ItemGroup> <PropertyGroup Label="Globals"> <ProjectGuid>{9D4C4AD6-BE26-49CD-90C3-78954404E222}</ProjectGuid> <Keyword>Win32Proj</Keyword> <RootNamespace>ConsoleApplication1</RootNamespace> <VCTargetsPath>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\</VCTargetsPath> <TargetPlatformVersion>8.1</TargetPlatformVersion> <TargetFrameworkVersion>v4.0.30319</TargetFrameworkVersion> </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <ConfigurationType>Application</ConfigurationType> <UseDebugLibraries>true</UseDebugLibraries> <PlatformToolset>v140</PlatformToolset> <CharacterSet>Unicode</CharacterSet> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <ConfigurationType>Application</ConfigurationType> <UseDebugLibraries>false</UseDebugLibraries> <PlatformToolset>v140</PlatformToolset> <WholeProgramOptimization>true</WholeProgramOptimization> <CharacterSet>Unicode</CharacterSet> </PropertyGroup>2、(1)请特别要注意变量VCTargetsPath,它的初始值在注册表有定义,路径是:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\12.0VCTargetsPath=$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(MSBuildExtensionsPath32)\Microsoft.Cpp\v4.0\V120\'))默认指向了VS2013的工作路径,这里在*.vcxproj文件里修改为MSVC 2015:C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\千万小心,字符串V140后面还有个"\"字符,这个字符可别遗漏了,否则后果不堪设想......(2) <TargetFrameworkVersion>v4.0.30319</TargetFrameworkVersion> 这句话可有可无要确保版本号与C:\Windows\Microsoft.NET\Framework\v4.0.30319一致。修改完毕后,就可以重新打开工程,进行MSVC 2015编译了。如图所示,工程是属性页可以看到平台工具集里面新增了编译器“Visual Studio 2015(v140)”,其中“未安装”三个字不必理会它,不影响使用。(#^.^#)(3)记事本打开ConsoleApplication1.sln文件,修改VisualStudioVersion为:VisualStudioVersion = 14.0.24720.03、由于是VS2013的缘故,点击F7生成解决方案时,仍然会执行VS2013版本的MSBuild.exe,但是请放心,MSBuild最终会调用VS2015的编译器来编译源码。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\12.0MSBuildToolsPath = C:\Program Files (x86)\MSBuild\12.0\bin\amd64\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSBuild\ToolsVersions\12.0MSBuildToolsPath = C:\Program Files (x86)\MSBuild\12.0\bin\三、断点调试1、由于是VS2013的缘故,点击F5启动调试时,仍然会执行VS2013版本自带的调试器。!囧!这个就没有办法切换成VS2015调试器了。除非放弃使用VS自带的调试器,转而使用WinDbg。本地路径是C:\Program Files (x86)\Windows Kits\8.1\Debuggers。2、使用VS2013调试2015编译生成的程序,会出现可视化文件*.natvis不匹配的情况,毕竟编译器不同了,比如VS2015在C++ STL方面有较大改进。VS2013实时调试器(JIT:Just In Time):HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebugHKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebugDebugger = "C:\Windows\system32\vsjitdebugger.exe" -p %ld -e %ldVS2013的调试器路径是:C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger可视化文件在:C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers解决可视化文件*.natvis不匹配的方法请参见我另一篇博客:https://blog.csdn.net/libaineu2004/article/details/895031323、VS调试时,只使用自己带的调试器,不会使用WinDbg。WinDbg可以提供外部使用,安装方法如下:安装用于程序调试的WinDbg调试器,微软官方把WinDbg调试器隐含到Windows SDK 8.1中了,所以要安装Windows SDK。下载链接: https://developer.microsoft.com/en-us/windows/downloads/sdk-archive选择Windows 8.1版本安装,注意只需要装Debugging Tools for Windows。笔者注:我是全部完整地安装了Windows SDK 8.1。4、关于debugger的微软官网文档:怎么用调试器https://docs.microsoft.com/zh-cn/visualstudio/debugger/debugging-in-visual-studio 在 Visual Studio 调试器中指定符号 (.pdb) 和源文件 (C#, C++,Visual Basic 中, F#)https://docs.microsoft.com/zh-cn/visualstudio/debugger/specify-symbol-dot-pdb-and-source-files-in-the-visual-studio-debugger四、附录-Visual Studio 2010 - #Visual Studio 10 -Visual Studio 2012 - #Visual Studio 11 -Visual Studio 2013 - #Visual Studio 12 -Visual Studio 2015 - #Visual Studio 14 -Visual Studio 2010 - VisualStudioVersion=10 -Visual Studio 2012 - VisualStudioVersion=11 -Visual Studio 2013 - VisualStudioVersion=12 -Visual Studio 2015 - VisualStudioVersion=14 -Visual Studio 2008 - ToolsVersion 3.5 -Visual Studio 2010 - ToolsVersion 4.0 -Visual Studio 2012 - ToolsVersion 4.0 -Visual Studio 2013 - ToolsVersion 12.00 -Visual Studio 2015 - ToolsVersion 14.00# Visual Studio 14 VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 # Visual Studio 12 VisualStudioVersion = 12.0.40629.0 MinimumVisualStudioVersion = 10.0.40219.1
pro2vcxproj解决方法:qmake命令生成vs的vcproj文件。具体步骤:1、环境变量path,添加:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin或者Windows-开始-Qt命令行2、执行命令a、当你的xx.pro的TEMPLATE = subdirs时,qmake -r -tp vc xx.pro生成vcproj文件。b、其他情况下用:qmake -tp vc xx.pro或者qmake -t vcapp xx.pro生成vcxproj文件。3、生成指定版本的VS工程 在上面的命令中加入 -spec win32-msvc2008即可。 例如:qmake -spec win32-msvc2008 -r -tp vc xx.pro 递归的生成sln工程。
windows系统下主要的调试器:CDB ,只能调试用户程序,只有控制台界面,以命令行形式工作NTSD, 只能调试用户程序,只有控制台界面,以命令行形式工作KD,主要用于内核调试,有时候也用于用户态调试,只有控制台界面,以命令行形式工作WinDbg,在用户态、内核态下都能够发挥调试功能,采用了可视化的用户界面Qt Creator使用调试器可以是gdb和cdb,本篇文章只介绍cdb。一、安装CDBCDB(command line debugger)是给控制台调试代码用的,CDB是WinDbg的小兄弟。因为VS的VC++用的调试器是C:\Windows\System32\vsjitdebugger.exe,所以安装Visual Studio是没有cdb的。必须从WDK里面安装Debugging Tools for Windows。Windows SDK archive - Windows app development下载 Windows 驱动程序工具包 (WDK) - Windows drivers | Microsoft Docs安装完成后,在C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86或者x64路径下可以找到cdb.exe和gdb.exe。总之,qtcreator是不支持vsjitdebugger调试器的,只能使用cdb。二、关注Qt官网的一些要素,摘录以下几点 Qt Creator Windows Debugging - Qt Wiki1、32位版本的cdb.exe只能调试32位可执行文件。 64位版本可以调试64位和32位可执行文件,但是使用64位调试器中断32位可执行文件可能会导致显示Wow64 32位仿真层的堆栈跟踪。2、Qt Creator通过加载扩展库(qtcreatorcdbext.dll)来扩展命令行调试器。 必须为文件夹libs\qtcreatorcdbext64或libs\qtcreatorcdbext32中的32位和64位版本的调试器提供此库。D:\Qt\Qt5.9.8\Tools\QtCreator\lib\qtcreatorcdbext32\qtcreatorcdbext.dllD:\Qt\Qt5.9.8\Tools\QtCreator\lib\qtcreatorcdbext64\qtcreatorcdbext.dll3、首次启动调试时,系统会提示您设置Symbol服务器,该服务器会在调试器的符号路径中添加一个特殊条目。 Symbol Server提供操作系统和编译器运行时库的调试信息。 初始下载可能非常耗时。使用符号进行调试 - Win32 apps | Microsoft DocsSymbols for Windows debugging (WinDbg, KD, CDB, NTSD) - Windows drivers | Microsoft Docs4、过时的.pdb文件可以减慢调试速度。 干净的构建可以提供帮助。 此外,增量链接可能会影响调试(在日志中检查“无法验证模块的校验和...”)。可以通过添加禁用增量链接,在.pro工程文件加入:QMAKE_LFLAGS_DEBUG += /INCREMENTAL:NO三、什么是symbols?它是干什么用的?Symbols用于程序调试的数据,它包含了调试中需要用到的各种数据,例如:全局变量、本地变量、函数名、函数类型、源代码行、程序入口地址.....,这些所有的东西都叫做Symbol,Symbol Files中文名叫符号文件。 在windows系统中,windows2000将这些信息保存在.pdb和.dbg这些的文件中,而windowsXP和以后的版本都将这些信息保存在.pdb文件中。 Symbol一般分为两种:Public和Private,其实我们应该很容易理解他们,就是允许公开的数据和私有的数据。我们在发布产品的时候,可以同时发布Symbol数据,对于Symbol数据发布的粒度,我们也是可以去查看和控制的(下面会介绍PDBCopy和Symchk)。 在NET中,我们也可以看到VS生成的Symbols,在VS生成的DLL目录下面,我们除了DLL外,还可以看到另外的一类文件.pdb(如下图),VS能提供给我们这么大的调试能力和它是分不开的。PDB(Program Database),是微软开发的用于存储程序调试信息的文件格式。pdb文件是由源码在编译期生成,存储了源文件名称,变量名,函数名,FPO(帧指针),对应行号等信息。由于体积庞大,同时出于安全性考虑,可运行程序exe或者dll文件都是无符号的。说白了,符号文件可以帮助你调试程序,可以追踪到编译器提供的库和操作系统本身的代码;调试符号就是这些代码内的符号;调试符号数据库,记录了变量,函数这一类符号和内存定位的关系,从而可以用地址相关信息追踪到变量名,函数名;方便调试。总之,符号文件包含大量的数据,这些数据在运行二进制文件时实际上并不需要,但在调试代码时很有用。四、QtCreator中配置CDB1、Qt官网有介绍:Setting Up Debugger | Qt Creator Manual打开 Tools >Options > Debugger> CDB Paths在Symbol Paths面板中, 选择 InsertSelect the directory where you want to store the cached information. Use a subfolder in a temporary directory, such as srv*D:\Qt\symbolcache*http://msdl.microsoft.com/download/symbolsSelect OK.srv*D:\Qt\symbolcache*http://msdl.microsoft.com/download/symbols这句话的意思是:指定用于符号解析的符号路径为本地路径D:\Qt\symbolcache,如果找不到就去http://msdl.microsoft.com/download/symbols下载。所以第一次断点调试时,需要下载等很久,第二次以后就不会了。下载下来的文件夹如图所示:2、教你如何一次性的完整下载所有 Symbol Files(不推荐)平常我们都只是在查看 Ntdll 的函数, 或者查看 Service Descriptor Table,这样CDB只会下载 ntdll.pdb 和 ntkrnlmp.pdb 或者 win32k.pdb 到 :\<用户路径>\Symbol。但其它的呢, 万一哪天要用到而 Microsoft 又停止支援怎办, 嗯~把它一次性通通下载到 :\<用户路径>\Symbol 好了。启动 DOS Command Line, 也就是 cmd.exe,先跳进CDB安装目录,在DOS输入cd C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86然后再输入symchk.exe /r C:\Windows\system32 /s SRV*D:\Qt\Symbols*http://msdl.microsoft.com/download/symbols表示查找C:\windows\system32文件夹和所有子文件夹中的所有符号文件,从微软官网下载到D:\Qt\Symbols。整个过程可能会持续N多个小时,因为win32下的动态库太多,个人感觉无需全部下载。在下载完成以后Qt Creator->Tools->Options->Debugger->CDB Paths->Symbol Paths将D:\Qt\Symbols添加到符号路径,这样debug过程中所需要的符号都会从本地搜索不会再链接符号服务器,也就不会再卡了。五、个人技巧与建议1、编译器使用MSVC 32bit时,CDB调试可以选择64bit,据说64bit调试更快?没有亲测,待观察。2、CDB断点调试,解决无法查看QString值。打开“工具->选项->调试器->CDB”,把“Use Python dumper”选项勾选去掉,保存即可。3、嫌CDB调试速度慢,解决办法如下:Qt Creator->Tools->Options->Debugger->CDB Paths->Symbol Paths -> 清空Symbol Paths。缺点是关闭了符号服务器,在调试到系统的运行库的时候会无法跟踪。4、之前下载的符号文件保存在D:\Qt\Symbols,注意,不要以为这些文件是通用的,不同操作系统(大系统有WinXP/Win7/Win10,而大系统又有细分很多小版本)对应的pdb文件是不同的,所以要求不同系统自己下载自己的符号文件。此外,当操作系统更新或升级后,很可能出现以前的符号文件就过时了的情况。5、VS调试符号文件(.pdb)的设置设置添加系统环境变量_NT_SYMBOL_PATH和_NT_ALT_SYMBOL_PATH的值为:_NT_SYMBOL_PATH=C:\Symbols;srv*C:\Symbols*http://msdl.microsoft.com/download/symbols_NT_ALT_SYMBOL_PATH=cache*C:\Symbols这样启动VS的时候它会自动查找这个变量,然后去相应的url地址上下载对应系统的符号文件,最后下载的符号文件保存在C:/Symbols路径下。这个路径必须是C:/Symbols。当然,可以根据需求自己改路径,使用mklink命令。用管理员权限打开CMD(windows开始菜单-所有程序-附件-命令提示符-右键,以管理员身份运行),输入命令:mklink /D C:\Symbols E:\software\Qt\symbolcache
\qt-creator-opensource-src-4.8.2\src\plugins\coreplugin\modemanager.h有C++类ModeManager的定义:class CORE_EXPORT ModeManager : public QObject Q_OBJECT public: static QObject *instance(); static IMode *currentMode(); static IMode *mode(Id id); static void addAction(QAction *action, int priority); Internal::FancyTabWidget *m_modeStack;//IDE左边整个竖条部分,包括左上方和左下方的工具栏 Internal::FancyActionBar *m_actionBar;//IDE左下方的工具栏一、怎么添加左下方工具栏按钮?构造函数初始化了m_actionBar,这个Bar就是指IDE左下方的工具栏。默认有运行,调试和构建三个按钮。ModeManager::ModeManager(Internal::MainWindow *mainWindow, Internal::FancyTabWidget *modeStack) m_instance = this; d = new ModeManagerPrivate(); d->m_mainWindow = mainWindow; d->m_modeStack = modeStack; d->m_oldCurrent = -1; d->m_actionBar = new Internal::FancyActionBar(modeStack); d->m_modeStack->addCornerWidget(d->m_actionBar);那我们如何添加自定义按钮呢?ModeManager的addAction就是实现添加IDE左边工具栏的函数。语句d->m_actionBar->insertAction(index, action);是关键。void ModeManager::addAction(QAction *action, int priority) d->m_actions.insert(action, priority); // Count the number of commands with a higher priority int index = 0; foreach (int p, d->m_actions) { if (p > priority) ++index; d->m_actionBar->insertAction(index, action); \src\plugins\coreplugin\fancyactionbar.cpp有函数实现: void FancyActionBar::insertAction(int index, QAction *action) auto *button = new FancyToolButton(action, this); button->setIconsOnly(m_iconsOnly); m_actionsLayout->insertWidget(index, button); }自定义工具栏时,就需要在外部调用Core::ModeManager::addAction(act, p);来添加按钮。如图所示:二、那么,左上方的<欢迎,编辑,Debug,项目和帮助>这几个按钮又是怎么来的呢?看源码:Internal::FancyTabWidget *m_modeStack;//IDE左边整个竖条部分,包括左上方和左下方的工具栏函数void ModeManagerPrivate::appendMode(IMode *mode)里面的m_modeStack->insertTab负责添加tab选项;void ModeManagerPrivate::appendMode(IMode *mode) const int index = m_modeCommands.count(); m_mainWindow->addContextObject(mode); m_modeStack->insertTab(index, mode->widget(), mode->icon(), mode->displayName(), mode->menu() != nullptr); m_modeStack->setTabEnabled(index, mode->isEnabled()); FancyTabWidget::insertTab再添加widget; void FancyTabWidget::insertTab(int index, QWidget *tab, const QIcon &icon, const QString &label, bool hasMenu) m_modesStack->insertWidget(index, tab); m_tabBar->insertTab(index, icon, label, hasMenu); }我们看到,m_modeStack->insertTab(index, mode->widget(), mode->icon(), mode->displayName(), mode->menu() != nullptr);这里的mode是什么东东?\src\plugins\coreplugin\imode.h有定义class CORE_EXPORT IMode : public IContext以下是关联的调用关系,外部初始化IMode时,就会addMode:IMode::IMode(QObject *parent) : IContext(parent) ModeManager::instance()->addMode(this); void ModeManager::addMode(IMode *mode) QTC_ASSERT(d->m_startingUp, return); d->m_modes.append(mode);
Qt Creator使用微软调试器,C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86\cdb.exe发现会报错:Exception at 0x7715c5af, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) (first chance) in dwrite!DWriteCreateFactory或者:-1: error: Debugger encountered an exception: Exception at 0x7fefcecb87d, code: 0x4242420: , flags=0x0 (first chance)网上查资料,从http://blog.sina.com.cn/s/blog_93fa5ced01010fqv.html得知: 在调试器中运行程序时,如果程序产生异常,调试器会首先获得通知(即First-chance exception),而后此异常由产生它的程序负责捕获。如果程序没有捕获此异常,那么调试器会再次被通知(即Second-chance exception,Last-chance exception),并结束程序。通常见到的“First-chance exception”一般是“0xC0000005: Access Violation”,“0xC00000FD: Stack Overflow”等,这些都说明程序中有缺陷,需要修正。但是也有一些属于正常的情况,例如“First-chance exception in xxx.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception”。Windows 操作系统中广泛使用了结构化异常(SEH)来处理特殊情况,许多和底层打交道的API都靠SEH来处理可能发生的意外。并且,这些API中都有捕获SEH的代码,产生的异常不会对程序造成影响。但是由于上面提到的“First-chance exception,Second-chance exception”机制,VC仍然会有输出,但是我们完全可以忽略。如果你实在不喜欢这些输出信息,那你就必须禁用对特定异常的“First-chance exception”捕获。如图所示,把勾选去掉即可。
出发点是不想完整安装VS2015,只想安装C++编译器,然后提供给Qt Creator使用。也就是说Windows下开发应用或库时,如果不想安装完整的Visual Studio,可以选择只安装Visual C++ Build Tools即可。The Microsoft Visual C++ Build Tools installs only the command-line compiler, tools, and libraries you need to build C and C++ programs. It's perfect for build labs or classroom exercises and installs relatively quickly. To install only the command-line tools, download and install Microsoft Visual C++ Build Tools 2015 .The following tools can help you to build a C/C++ project on the command line.1. CLUse the compiler (cl.exe) to compile and link source code files into apps, libraries, and DLLs.2. LinkUse the linker (link.exe) to link compiled object files and libraries into apps and DLLs.3. MSBuild (Visual C++)Use MSBuild (msbuild.exe) to build Visual C++ projects and Visual Studio solutions. This is equivalent to running the Build project or Build Solution command in the Visual Studio IDE.4. DEVENVUse DEVENV (devenv.exe) combined with a command-line switch—for example, /Build or /Clean—to perform certain build commands without displaying the Visual Studio IDE.5. NMAKEUse NMAKE (nmake.exe) to automate tasks that build Visual C++ projects by using a traditional makefile.第一:在链接 https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/,找到了可再发行组件和生成工具:Microsoft Visual C++ 2015 Redistributable 更新 3Microsoft 生成工具 2015 更新 3我们顺序安装。需要注意的一点是,在安装VS2015的生成工具的时候,请选择默认安装,默认的是winSDK 8.1。visualcppbuildtools_full.exe默认是在线安装,我们也可以设置成离线安装:visualcppbuildtools_full.exe /layout d:\vs2015第二,安装用于程序调试的WinDbg调试器,微软官方把WinDbg调试器隐含到Windows SDK 8.1中了,所以要安装Windows SDK。下载链接: https://developer.microsoft.com/en-us/windows/downloads/sdk-archive选择Windows 8.1版本安装,注意只需要装Debugging Tools for Windows。firecat注:我是全部完整地安装了Windows SDK 8.1。VS调试时,只使用自己带的调试器,不会使用WinDbg。WinDbg安装目录包含有CDB。CDB可以提供给Qt Creator调用。第三,安装QT(也要注意下载MSVC2015版本的QT)选择32位和64位的版本之后默认安装即可。第四:安装完成后系统会自动检测到QT versions,Compilers,Debuggers等,然后在Qt Creator配置好kit。第五:网上下载ucrtbased.dll库文件把32位的ucrtbased.dll拷贝到C:\Windows\SysWOW64目录把64位的ucrtbased.dll拷贝到C:\Windows\System32目录第六:源码编码格式注意: Qt Creator -> Options -> Text Editor -> Behavior -> File Encodings 更改设置为 "UTF-8",BOM设置为"Add If Encoding Is UTF-8",这样才能正确识别中文。总之VC++编译器只能识别ANSI和UTF-8+BOM这两种编码。不识别UTF-8。---友情链接,我的另一篇博客:CDB调试器使用技巧与心得,重点是Symbols Path设置
一、环境准备自己动手写qt creator插件之前,需要先编译Qt Creator源码。详情见博客:使用Qt Creator IDE+MSVC2015编译器组合,编译Qt Creator源码4.8.2版本二、编译器使用MSVC2015 32bit,qt creator源码编译完成,会生成很多exe,lib和dll。我们需要重点关注以下几个lib。因为qt creator插件会依赖它们。Debug\lib\qtcreator\Aggregationd4.libDebug\lib\qtcreator\Cored4.libDebug\lib\qtcreator\ExtensionSystemd4.libDebug\lib\qtcreator\Utilsd4.libRelease\lib\qtcreator\Aggregation4.libRelease\lib\qtcreator\Core4.libRelease\lib\qtcreator\ExtensionSystem4.libRelease\lib\qtcreator\Utils4.lib三、新建qt creator插件工程参考Qt官方文档 https://doc-snapshots.qt.io/qtcreator-extending/first-plugin.html工程.pro文件设置如下:DEFINES += FIRECAT_TOOLBAR_LIBRARY # firecat_Toolbar files SOURCES += \ firecat_toolbarplugin.cpp HEADERS += \ firecat_toolbarplugin.h \ firecat_toolbar_global.h \ firecat_toolbarconstants.h # Qt Creator linking ## Either set the IDE_SOURCE_TREE when running qmake, ## or set the QTC_SOURCE environment variable, to override the default setting #isEmpty(IDE_SOURCE_TREE): IDE_SOURCE_TREE = $$(QTC_SOURCE)#必须注释掉这句话 isEmpty(IDE_SOURCE_TREE): IDE_SOURCE_TREE = "D:/temp/qt-creator-opensource-src-4.8.2"#指向Qt Creator源码路径 ## Either set the IDE_BUILD_TREE when running qmake, ## or set the QTC_BUILD environment variable, to override the default setting #isEmpty(IDE_BUILD_TREE): IDE_BUILD_TREE = $$(QTC_BUILD)#必须注释掉这句话 #isEmpty(IDE_BUILD_TREE): IDE_BUILD_TREE = "D:/temp/build_plugins"#必须注释掉这句话 Debug:isEmpty(IDE_BUILD_TREE): IDE_BUILD_TREE = "D:/temp/build_plugins/debug/"#自定义Debug生成路径 Release:isEmpty(IDE_BUILD_TREE): IDE_BUILD_TREE = "D:/temp/build_plugins/release/"#自定义Release生成路径 ## uncomment to build plugin into user config directory ## <localappdata>/plugins/<ideversion> ## where <localappdata> is e.g. ## "%LOCALAPPDATA%\QtProject\qtcreator" on Windows Vista and later ## "$XDG_DATA_HOME/data/QtProject/qtcreator" or "~/.local/share/data/QtProject/qtcreator" on Linux ## "~/Library/Application Support/QtProject/Qt Creator" on OS X #USE_USER_DESTDIR = yes #必须注释掉这句话,否则插件会生成在默认的路径,即C:\Users\firecat\AppData\Local\QtProject\QtCreator\plugins\4.8.2 ###### If the plugin can be depended upon by other plugins, this code needs to be outsourced to ###### <dirname>_dependencies.pri, where <dirname> is the name of the directory containing the ###### plugin's sources. QTC_PLUGIN_NAME = firecat_Toolbar QTC_LIB_DEPENDS += \ # nothing here at this time QTC_PLUGIN_DEPENDS += \ coreplugin QTC_PLUGIN_RECOMMENDS += \ # optional plugin dependencies. nothing here at this time ###### End _dependencies.pri contents ###### include($$IDE_SOURCE_TREE/src/qtcreatorplugin.pri) RESOURCES += \ res.qrc注意:路径指向一定要搞正确,否则编译失败1、IDE_SOURCE_TREE指的是Qt Creator的源码路径2、IDE_BUILD_TREE指的是插件生成的路径,必须明确,否则会跑到默认路径:C:\Users\<用户名>\AppData\Local\QtProject\QtCreator\plugins\4.8.23、include($$IDE_SOURCE_TREE/src/qtcreatorplugin.pri)4、插件编译请选择release,因为debug没有意义,没有用处。四、编写插件代码,我的目的是想把自己常用的功能加入到左边的工具栏中:第一个新增按钮是计算器,点击之后会调用微软计算器;第二个新增按钮是忽略部署直接运行;第三个新增按钮是忽略部署直接开始调试。bool firecat_ToolbarPlugin::initialize(const QStringList &arguments, QString *errorString) // Register objects in the plugin manager's object pool // Load settings // Add actions to menus // Connect to other plugins' signals // In the initialize function, a plugin can be sure that the plugins it // depends on have initialized their members. Q_UNUSED(arguments) Q_UNUSED(errorString) //我们把RunWithoutDeploy这个方法提携到工具栏,方便使用 const char id1[] = "ProjectExplorer.RunWithoutDeploy";//这个id对应的是Qt Creator源码的const char RUNWITHOUTDEPLOY[] QAction *act1 = Core::ActionManager::command(id1)->action();//对应Qt Creator源码的m_runWithoutDeployAction if (act1 == NULL) return false; const Utils::Icon CLASSIC1(":/image/mode_run.png");//32位图片,34*34像素 const Utils::Icon FLAT1({{":/image/mode_run_mask.png", Utils::Theme::IconsRunToolBarColor}});//8位图片,34*34像素 const Utils::Icon FLAT_ACTIVE1({{":/image/mode_run_mask.png", Utils::Theme::IconsModeWelcomeActiveColor}}); act1->setIcon(Utils::Icon::modeIcon(CLASSIC1, FLAT1, FLAT_ACTIVE1)); //act1->setIcon(Utils::Icon::sideBarIcon(CLASSIC1, FLAT1)); act1->setVisible(true); Core::ModeManager::addAction(act1, 130); //我们把DebugWithoutDeploy这个方法提携到工具栏,方便使用 const char id2[] = "Debugger.DebugWithoutDeploy"; QAction *act2 = Core::ActionManager::command(id2)->action();//对应Qt Creator源码的m_debugWithoutDeployAction if (act2 == NULL) return false; const Utils::Icon CLASSIC2(":/image/mode_debug.png"); const Utils::Icon FLAT2({{":/image/mode_debug_mask.png", Utils::Theme::IconsRunToolBarColor}}); const Utils::Icon FLAT_ACTIVE2({{":/image/mode_debug_mask.png", Utils::Theme::IconsModeWelcomeActiveColor}}); act2->setIcon(Utils::Icon::modeIcon(CLASSIC2, FLAT2, FLAT_ACTIVE2)); //act2->setIcon(Utils::Icon::sideBarIcon(CLASSIC2, FLAT2)); act2->setVisible(true); Core::ModeManager::addAction(act2, 120); //我们把微软计算器提携到工具栏,方便使用 #if defined(Q_OS_WIN32) QAction *act3 = new QAction(tr("calc"), this); const Utils::Icon CLASSIC3(":/image/mode_calc.png"); const Utils::Icon FLAT3({{":/image/mode_calc_mask.png", Utils::Theme::IconsRunToolBarColor}}); const Utils::Icon FLAT_ACTIVE3({{":/image/mode_calc_mask.png", Utils::Theme::IconsModeWelcomeActiveColor}}); act3->setIcon(Utils::Icon::modeIcon(CLASSIC3, FLAT3, FLAT_ACTIVE3)); //act3->setIcon(Utils::Icon::sideBarIcon(CLASSIC3, FLAT3)); act3->setVisible(true); //QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);//Qt自身没有提供System32的路径 wchar_t szPath[MAX_PATH] ={0}; GetSystemDirectory(szPath, MAX_PATH); QString path = QString::fromWCharArray(szPath); connect(act3, &QAction::triggered, this, [=]() { QProcess *poc = new QProcess; poc->start(path + "\\calc.exe");//即"C:\\Windows\\system32\\calc.exe" Core::ModeManager::addAction(act3, 150); #endif // 因为Qt Creator源码有定义位置摆放的优先级 // Action priorities //const int P_ACTION_RUN = 100; //const int P_ACTION_BUILDPROJECT = 80; //const int P_ACTION_DEBUG = 90; // Priority for the modemanager. //ModeManager::addAction(cmd->action(), Constants::P_ACTION_RUN); return true; } release编译生成firecat_Toolbar4.dll,然后放入到官方Qt Creator的安装路径即可。D:\Qt\Qt5.9.8\Tools\QtCreator\lib\qtcreator\plugins\注意,Qt官方发布的Windows版本Qt Creator IDE就是使用MSVC2015 32bit编译出来的。大功告成(#^.^#)五、完整的工程源码及库文件下载链接:https://download.csdn.net/download/libaineu2004/11131466上传的源码有一处需要调整一下,源文件夹有firecat_Toolbar.json.in文件,把它修改为:{ \"Name\" : \"firecat_Toolbar\", \"Version\" : \"$$QTCREATOR_VERSION$$VERSION_SUFFIX\", \"CompatVersion\" : \"$$QTCREATOR_COMPAT_VERSION\", \"Vendor\" : \"firecatStudio\", \"License\" : \"\", \"Description\" : \"\", \"Url\" : \"\", $$dependencyList }这样可以自适应QtCreator版本号六、如果想知道Qt Creator插件的工作原理,请参见我的下一篇博客:Qt Creator plugin动手实践(3)C++ 类ModeManager源码分析---ico图标下载https://icons8.com/https://www.easyicon.net/
一、官方源码下载,qt-creator-opensource-src-4.8.2.zip1、官方github源码https://github.com/qt-creator/qt-creator Qt Creator源码https://github.com/qt-creator/qt-creator/tree/master/src/plugins/designer Qt Creator的设计师插件https://github.com/qt/qtbase Qt核心类源码https://github.com/qt/qttools Qt工具类源码https://github.com/qt/qttools/tree/dev/src/designer Qt设计师的源码https://github.com/qt/qttools/tree/dev/src/windeployqt 依赖库工具源码2、官方正式发行网站http://download.qt.io/official_releases/qt/5.12/5.12.5/submodules/ qttools-opensource-src-5.12.5.zip,里面有Qt设计师的源码http://download.qt.io/official_releases/qtcreator/4.8/4.8.2/ 我们从这里下载准备要编译的Qt Creator源码3、编译声明编译Qt设计师和编译Qt Creator,都要确保使用的Qt版本与之配套,否则会出错。笔者的实践是:(1)使用Qt 5.12.5+MSVC 2017 32bit版本,可以成功编译qttools-opensource-src-5.12.5qt-creator-opensource-src-4.8.2(2)使用Qt 5.9.8+MSVC 2015 32bit版本,可以成功编译qt-creator-opensource-src-4.8.2接下来的内容,就举例(2)来讲解。二、IDE和编译器准备Qt Creator IDE和MSVC 2015编译器组合使用(不想完整安装VS2015)三、编译源码qt-creator-opensource-src-4.8.2其实Qt官方自己就是使用MSVC2015 32bit编译Qt Creator IDE的。为什么采用Visual Studio的msvc编译器,而不是MinGW的gcc编译器?因为前者比后者编译速度更快。一般来说Windows下就是MinGW的gcc和Visual Studio的nmake,在Windows下推荐使用MSVC编译器,能够加快编译速度。MinGW,其实它就是一个移植版本的GCC,的确是不如VC++快的。如果是其它平台,那么编译器可以换成LLVM的clang,那就快很多了。所以结论:在Windows平台还是尽量用MSVC编译器!我们现在就来使用QtCreator编译QtCreator源码。(#^.^#)说起来有点饶舌。使用Qt Creator IDE打开源码qt-creator-opensource-src-4.8.2文件夹里的qtcreator.pro,使用MSVC2015 32bit,开始编译,结果失败了,报错:jom: D:\temp\build-qtcreator-Desktop_Qt_5_9_8_MSVC2015_32bit-Debug\src\Makefile [sub-libs-make_first-ordered] Error 2jom: D:\temp\build-qtcreator-Desktop_Qt_5_9_8_MSVC2015_32bit-Debug\Makefile [sub-src-make_first-ordered] Error 221:34:20: 进程"D:\Qt\Qt5.9.8\Tools\QtCreator\bin\jom.exe"退出,退出代码 2 。Error while building/deploying project qtcreator (kit: Desktop Qt 5.9.8 MSVC2015 32bit)When executing step "Make"然后在“构建和运行”,把“使用jom代替nmake”的勾选去掉。结果还是报错:cd D:\temp\build-qtcreator-Desktop_Qt_5_9_8_MSVC2015_32bit-Debug\src\libs\botan\build && python D:\temp\qt-creator-opensource-src-4.8.2\src\libs\botan\..\3rdparty\botan\configure.py --cc=msvc --cc-bin=cl --cpu=x86 --amalgamation --minimized-build --disable-shared --enable-modules=aes,aes_ssse3,auto_rng,bigint,block,cbc,ctr,des,dh,dsa,ec_group,ecdh,ecdsa,entropy,filters,hmac,mode_pad,pubkey,rsa,sha1,sha1_sse2,sha1_x86,sha2_32,sha2_32_x86,sha2_64,simd,system_rng,emsa_pkcs1,pbes2,pbkdf2 --without-documentation --link-method=hardlink --debug-mode --cxxflags="-nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew /wd4100 /wd4800 /wd4127 /wd4244 /wd4250 /wd4267 /wd4334 /wd4702 /wd4996 /D_ENABLE_EXTENDED_ALIGNED_STORAGE"'python' 不是内部或外部命令,也不是可运行的程序或批处理文件。NMAKE : fatal error U1077: 'cd' : return code '0x1'Stop.NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"' : return code '0x2'Stop.NMAKE : fatal error U1077: 'cd' : return code '0x2'Stop.NMAKE : fatal error U1077: 'cd' : return code '0x2'Stop.NMAKE : fatal error U1077: 'cd' : return code '0x2'Stop.21:19:02: 进程"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"退出,退出代码 2 。Error while building/deploying project qtcreator (kit: Desktop Qt 5.9.8 MSVC2015 32bit)When executing step "Make"于是,上网找资料,找到了官方的说法:https://wiki.qt.io/Building_Qt_Creator_from_Githttps://wiki.qt.io/Building_Qt_5_from_GitPlease also read README.md in the source tree.我在\qt-creator-opensource-src-4.8.2\README.md,看到如下说明,看来编译Qt Creator源码需要安装perl和Python解释器。## Compiling Qt CreatorPrerequisites:* Qt 5.9.0 or later* Qt WebEngine module for QtWebEngine based help viewer* On Windows: * ActiveState Active Perl * MinGW with g++ 5.3 or Visual Studio 2015 or later * jom * Python 3.5 or later (optional, needed for the python enabled debug helper)* On Mac OS X: latest Xcode* On Linux: g++ 5.3 or later* LLVM/Clang 6.0.0 or later (optional, needed for the Clang Code Model, see the section "Get LLVM/Clang for the Clang Code Model") * CMake (only for manual builds of LLVM/Clang)* Python 2.6 or later (needed for building the bundled Botan library)* Qbs 1.7.x (optional, sources also contain Qbs itself)四、重整旗鼓,继续1、环境准备,安装perl和pythonhttps://www.activestate.com/products/perl/downloads/ActivePerl-5.28 x64Typical安装Add perl to the PATH 勾选perl -vhttps://www.python.org/Add Python 3.6 to PATH勾选自定义安装,全选Install for all users勾选2、使用Qt Creator IDE,MSVC2015 32bit,打开源码的qtcreator.pro,没有什么需要额外设置的,直接构建即可。debug和release分别编译,顺利完成。(#^.^#)欢迎访问我的另一篇博客《在Windows和macOS平台,自主编译Qt Creator和Qt Designer源码》-------参考Qt的官方文献https://wiki.qt.io/Building_Qt_Creator_from_Githttps://code.qt.io/cgit/qt-creator/qt-creator.git/tree/README.md
右键打开cmd命令1、进入具体某个文件夹的路径2、鼠标点击文件夹弹出右键菜单,点击的同时要按住shift键3、弹出的菜单会有“在此处打开命令窗口”选项。恭喜(#^.^#)管理员权限打开cmd命令Windows桌面-开始-所有程序-附件-命令提示符,右键菜单,管理员权限打开Windows cmd代理上网Windows使用代理网络上网时,如果需要配置cmd命令行也能上网,使用如下命令配置:=======管理员打开cmd,设置代理,source=ie指的是和ie浏览器的代理设置保持一致=========netsh winhttp import proxy source=ie注意:此命令需要在管理员权限下配置。Windows桌面-开始-所有程序-附件-命令提示符,右键菜单,管理员权限打开=======如何查看代理=========netsh winhttp show proxy=======如何取消代理=========netsh winhttp reset proxygit cmd输入命令:http代理:set http_proxy=http://127.0.0.1:8000set https_proxy=http://127.0.0.1:8000set http_proxy=socks5://127.0.0.1:8000set https_proxy=socks5://127.0.0.1:8000git http代理:【推荐使用】git config --global http.proxy http://127.0.0.1:8000git config --global https.proxy http://127.0.0.1:8000设置成功,会记录在C:\Users\firecat\.gitconfig,文本内容是:[core] autocrlf = true[credential "helperselector"] selected = manager[http] proxy = http://127.0.0.1:8100[https] proxy = http://127.0.0.1:8100git socks5代理:git config --global http.proxy socks5://127.0.0.1:8000git config --global https.proxy socks5://127.0.0.1:8000取消代理git config --global --unset http.proxygit config --global --unset https.proxy查看代理git config --get --global http.proxygit config --get --global https.proxygit config --get --global http.proxy socks5git config --get --global https.proxy socks5增强版cmd终端工具cmder【推荐】Lovely console emulator package for Windows。安装路径必须在英文路径,不能有中文。https://cmder.net/https://github.com/cmderdev/cmderhttps://www.cnblogs.com/michael-xiang/p/10466074.html 教程babunhttp://babun.github.io/https://github.com/babun/babunpowercmdhttp://www.powercmd.com/terminal微软新开发的终端工具,只能在Win10使用,不支持Win7https://github.com/microsoft/terminal参考文献https://www.jianshu.com/p/b9047a59ffc9
Qt Creator plugin如果把D:\Qt\Qt5.9.8\Tools\QtCreator\lib\qtcreator\plugins\路径下的文件全部删除(只保留Core4.dll文件),然后再启动,那么Qt Creator就变成这样了,简直就是个空壳子:可见Qt Creator这个庞然大物是由各类插件构成的!把插件拿掉,它就只是一张皮了。官网下载:http://download.qt.io/official_releases/qtcreator/https://github.com/qthttps://github.com/qt-creator/qt-creatorhttps://github.com/qt-creator/qt-creator/tree/master/src/plugins/helloworld官网文档:https://doc.qt.io/qtcreator/index.htmlhttps://doc-snapshots.qt.io/qtcreator-extending/first-plugin.html网络教程:https://www.devbean.net/2012/03/qtcreator-plugin-develop-catalog/ Qt Creator 插件开发,翻译自<Writing-Qt-Creator-Plugins.pdf>https://www.devbean.net/category/qt-creator-%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0/ Qt Creator 源码学习开源项目参考:https://github.com/lexxmark/QtCreator-JsExtensions-Pluginhttps://github.com/pasccom/QtcDevPluginhttps://github.com/MichaelSp/QtCreator-Jenkins-Pluginhttps://github.com/Eaknyt/QtCreator-ColorPickerPluginQt5:qtdesigner的源码在Qt Creator源码里面,以插件形式出现https://github.com/qt-creator/qt-creator/tree/master/src/plugins/designerQt4:Qt Creator源码里面是没有设计器的实际的代码的,它使用的是QtDesigner.dll。qtdesigner的源码在qtsdk中。以qt4.8源码为例:qtdesigner.dll的源码路径为\tools\designer\srchttps://github.com/qt/qt/tree/4.8/tools/designer个人笔记:2019/4/19,摘录于Qt Creator源码projectexplorericons.cpp //ico文件定义 D:\temp\qt-creator-opensource-src-4.8.2\src\plugins\projectexplorer\projectexplorer.cpp bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *error) // run icon const QIcon runSideBarIcon = Utils::Icon::sideBarIcon(Icons::RUN, Icons::RUN_FLAT); const QIcon runIcon = Utils::Icon::combinedIcon({Utils::Icons::RUN_SMALL.icon(), runSideBarIcon}); runMenu->menu()->setIcon(runIcon); runMenu->menu()->setTitle(tr("Run")); msubProjectContextMenu->addMenu(runMenu, ProjectExplorer::Constants::G_PROJECT_RUN); // run action dd->m_runAction = new QAction(runIcon, tr("Run"), this); cmd = ActionManager::registerAction(dd->m_runAction, Constants::RUN); cmd->setAttribute(Command::CA_UpdateText); cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+R"))); mbuild->addAction(cmd, Constants::G_BUILD_RUN); ModeManager::addAction(cmd->action(), Constants::P_ACTION_RUN); // build session action const QIcon sideBarIcon = Utils::Icon::sideBarIcon(Icons::BUILD, Icons::BUILD_FLAT); const QIcon buildIcon = Utils::Icon::combinedIcon({Icons::BUILD_SMALL.icon(), sideBarIcon}); dd->m_buildSessionAction = new QAction(buildIcon, tr("Build All"), this); // build action dd->m_buildAction = new Utils::ParameterAction(tr("Build Project"), tr("Build Project \"%1\""), Utils::ParameterAction::AlwaysEnabled, this); dd->m_buildAction->setIcon(buildIcon); cmd = ActionManager::registerAction(dd->m_buildAction, Constants::BUILD); cmd->setAttribute(Command::CA_UpdateText); cmd->setDescription(dd->m_buildAction->text()); cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+B"))); mbuild->addAction(cmd, Constants::G_BUILD_BUILD); // Run without deployment action dd->m_runWithoutDeployAction = new QAction(tr("Run Without Deployment"), this); cmd = ActionManager::registerAction(dd->m_runWithoutDeployAction, Constants::RUNWITHOUTDEPLOY); mbuild->addAction(cmd, Constants::G_BUILD_RUN); dd->m_runActionContextMenu = new QAction(runIcon, tr("Run"), this); cmd = ActionManager::registerAction(dd->m_runActionContextMenu, Constants::RUNCONTEXTMENU, projecTreeContext); mprojectContextMenu->addAction(cmd, Constants::G_PROJECT_RUN); msubProjectContextMenu->addAction(cmd, Constants::G_PROJECT_RUN); //左边栏按钮 ModeManager::addAction(dd->m_modeBarBuildAction, Constants::P_ACTION_BUILDPROJECT); //Build ModeManager::addAction(cmd->action(), Constants::P_ACTION_RUN); //Run ModeManager::addAction(&m_visibleStartAction, Constants::P_ACTION_DEBUG); //Debug connect(dd->m_runAction, &QAction::triggered, dd, []() { m_instance->runStartupProject(Constants::NORMAL_RUN_MODE); }); connect(dd->m_runWithoutDeployAction, &QAction::triggered, dd, []() { m_instance->runStartupProject(Constants::NORMAL_RUN_MODE, true); }); D:\temp\qt-creator-opensource-src-4.8.2\src\plugins\debugger\debuggerplugin.cpp connect(&m_debugWithoutDeployAction, &QAction::triggered, this, [] { ProjectExplorerPlugin::runStartupProject(ProjectExplorer::Constants::DEBUG_RUN_MODE, true); void ProjectExplorerPluginPrivate::updateRunWithoutDeployMenu() m_runWithoutDeployAction->setVisible(m_projectExplorerSettings.deployBeforeRun); connect(this, &ProjectExplorerPlugin::updateRunActions, dd, &ProjectExplorerPluginPrivate::slotUpdateRunActions); void ProjectExplorerPluginPrivate::slotUpdateRunActions() QString whyNot; const bool state = ProjectExplorerPlugin::canRunStartupProject(Constants::NORMAL_RUN_MODE, &whyNot); m_runAction->setEnabled(state); m_runAction->setToolTip(whyNot); m_runWithoutDeployAction->setEnabled(state); void DebuggerPluginPrivate::updateDebugWithoutDeployMenu() const bool state = ProjectExplorerPlugin::projectExplorerSettings().deployBeforeRun; m_debugWithoutDeployAction.setVisible(state); connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::updateRunActions, this, &DebuggerPluginPrivate::updatePresetState); void DebuggerPluginPrivate::updatePresetState() if (m_shuttingDown) return; Project *startupProject = SessionManager::startupProject(); RunConfiguration *startupRunConfig = RunConfiguration::startupRunConfiguration(); DebuggerEngine *currentEngine = EngineManager::currentEngine(); QString whyNot; const bool canRun = ProjectExplorerPlugin::canRunStartupProject(ProjectExplorer::Constants::DEBUG_RUN_MODE, &whyNot); m_debugWithoutDeployAction.setEnabled(canRun); D:\temp\qt-creator-opensource-src-4.8.2\src\plugins\debugger\images\debugger_continue@2x.png D:\temp\qt-creator-opensource-src-4.8.2\src\plugins\debugger\images\mode_debug_mask@2x.png D:\temp\qt-creator-opensource-src-4.8.2\src\plugins\welcome\images\mode_welcome_mask@2x.png D:\temp\qt-creator-opensource-src-4.8.2\src\plugins\projectexplorer\images\run.png D:\temp\qt-creator-opensource-src-4.8.2\src\plugins\projectexplorer\images\desktopdevice.png D:\temp\qt-creator-opensource-src-4.8.2\src\plugins\projectexplorer\images\BuildSettings.png D:\temp\qt-creator-opensource-src-4.8.2\src\plugins\projectexplorer\images\debugger_start@2x.png
方法1:把“在运行项目前总是先部署”的勾选去掉。方法2:构建和运行的选项不修改,都保持勾选状态,然后给以下两条命令分别添加F7和F8的快捷键当然,在构建和调试菜单也可以看见这两条命令:方法3:新建Qt Creator插件(更灵活,推荐)使用Qt Creator plugin,新建工具栏按钮的方式实现。生成完,放入路径D:\Qt\Qt5.9.8\Tools\QtCreator\lib\qtcreator\plugins,如图所示,新增了三个按钮,把常用功能拉进来。图1是扁平风格,图2是经典风格。 详情参见博客:Qt Creator plugin动手实践(2)自己动手写qt creator插件,实现自定义工具栏按钮
1、指定临时文件Qt Creator默认情况下把所有的编译中间文件都生成到debug和release文件夹里。可以在.pro文件中加入:MOC_DIR = temp/mocRCC_DIR = temp/rccUI_DIR = temp/uiOBJECTS_DIR = temp/obj这样,编译时生成的临时文件就按不同类型分类放到项目下的temp文件夹中了。2、指定库文件路径PWD/OUT_PWD/_PRO_FILE_/_PRO_FILE_PWD_PWD指的是当前正在解析的.pro文件的目录的完整路径。 在编写支持影子构建的项目文件时,PWD很有用。message($$PWD)OUT_PWD指的是qmake生成的Makefile的目录的完整路径。即构建目录,例如build-??-Desktop_Qt_5_12_8_MSVC2017_64bit-Debugmessage($$OUT_PWD)_PRO_FILE_正在使用的项目文件的路径。message($$_PRO_FILE_)_PRO_FILE_PWD_包含目录的路径,该目录包含正在使用的项目文件。message($$_PRO_FILE_PWD_)如何区分这4个变量?qmake的若干与路径相关的变量,如何区分它们?PWD.pro或.pri所在路径,注意区分_PRO_FILE_PWD__PRO_FILE_PWD_pro文件所在路径(注意:即使它在pri文件内,也是指代的包含它的pro所在的路径)_PRO_FILE_pro的全路径OUT_PWDmakefile所在路径,和_PRO_FILE_PWD_对应 #当不使用shadow build构建时,OUT_PWD和_PRO_FILE_PWD_是相同的.#据此,我们可以判断采用了何种构建方式,进而采用不同的动作:!contains(_PRO_FILE_PWD_, $${OUT_PWD}) {#do something when using shadow build}#不建议使用contains,而是直接使用equals更好些,但是manual对此没有任何说明,!equals(_PRO_FILE_PWD_, OUT_PWD) {#do something when using shadow build}#打印测试message("PWD=") message($$PWD) message("OUT_PWD=") message($$OUT_PWD) message("_PRO_FILE_=") message($$_PRO_FILE_) message("_PRO_FILE_PWD_=") message($$_PRO_FILE_PWD_)另外,也可以指定目标文件的路径Debug:DESTDIR = $$PWD/../bin_dRelease:DESTDIR = $$PWD/../binLIBS += -L folderPath //引入的lib文件的路径 -L:引入路径Debug:LIBS+= -L folderPath // Debug 版引入的lib 文件路径Release:LIBS+= -L folderPath // release 版引入的lib文件路径DEPENDPATH:工程的依赖路径INCLUDEPATH:指定工程要用到的头文件路径,一般包括用户自定义的头文件路径或没有放入系统头文件路径的头文件路径CONFIG(debug, debug|release):LIBS += -L../lib1 -lhellodCONFIG(release, debug|release):LIBS += -L../lib2 -lhello例如:INCLUDEPATH += "muparser/include" #firecat modify DEPENDPATH += "muparser/lib" LIBS += "F:\CADCAM\QCAD\src\LibreCAD-v1.0.4\generated\lib\muparser.lib" lib举例 #生成lib DLL_NAME = muparser win32:CONFIG(debug, debug|release) { TARGET = $${DLL_NAME}d } else { TARGET = $$DLL_NAME #添加lib win32:CONFIG(debug, debug|release): { LIBS += "../bin/lib/muparserd.lib" else:win32:CONFIG(release, debug|release): { LIBS += "../bin/lib/muparser.lib" #通用公式 defineReplace(qtLibraryName) { unset(LIBRARY_NAME) LIBRARY_NAME = $$1 CONFIG(debug, debug|release) { !debug_and_release|build_pass { mac:RET = $$member(LIBRARY_NAME, 0)_debug else:win32:RET = $$member(LIBRARY_NAME, 0)d isEmpty(RET):RET = $$LIBRARY_NAME return($$RET) #大写的L表示路径;小写的l表示库文件 LIBS += -L$${DESTDIR} #lib path LIBS *= -l$$qtLibraryName(ribbonTabbar) 关于defineReplace的详情,请见文章末尾的姊妹篇。 绝对路径: QSKIALIB_PATH = ../$$DESTDIR message($$absolute_path($$QSKIALIB_PATH))3、分享我个人的.pro工程文件#qt引用模块核心功能,界面,网络,串口 QT += core gui network sql serialport widgets #这是Qt5为了兼容Qt4而专门设计的 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #工程所使用的模版;app表示是应用程序;lib则表明是库 TEMPLATE=app #临时文件存放位置 MOC_DIR = temp/moc #指定moc命令将含Q_OBJECT的头文件转换成标准.h文件的存放目录 RCC_DIR = temp/rcc #指定rcc命令将.qrc文件转换成qrc_*.h文件的存放目录 UI_DIR = temp/ui #指定rcc命令将.qrc文件转换成qrc_*.h文件的存放目录 OBJECTS_DIR = temp/obj #指定目标文件(obj)的存放目录 #指定生成的应用程序放置的目录 #DESTDIR = bin #指定生成的应用程序放置的目录 IDE_SOURCE_TREE = $$PWD #.pro或.pri文件所在的位置 IDE_BUILD_TREE = $$IDE_SOURCE_TREE/../ win32:CONFIG(debug, debug|release){ contains(DEFINES, WIN64) { DESTDIR = $$IDE_BUILD_TREE/_debug64 } else { DESTDIR = $$IDE_BUILD_TREE/_debug86 } else:win32:CONFIG(release, debug|release){ contains(DEFINES, WIN64) { DESTDIR = $$IDE_BUILD_TREE/_release64 } else { DESTDIR = $$IDE_BUILD_TREE/_release86 macx:CONFIG(debug, debug|release){ DESTDIR = $$IDE_BUILD_TREE/_debug64 } else:macx:CONFIG(release, debug|release){ DESTDIR = $$IDE_BUILD_TREE/_release64 #指定生成的应用程序名和图标 TARGET = Hello RC_ICONS = Hello.ico #定义编译选项 #QT_DEPRECATED_WARNINGS表示当Qt的某些功能被标记为过时的,那么编译器会发出警告 DEFINES += QT_DEPRECATED_WARNINGS #指定编译器选项和项目配置 CONFIG += c++11 CONFIG += warn_on #告诉qmake要把编译器设置为输出警告信息的 CONFIG += precompile_header #可以在项目中使用预编译头文件的支持 #预编译头文件路径 PRECOMPILED_HEADER = $$PWD/stable.h #disable C4819 warning win32:QMAKE_CXXFLAGS_WARN_ON += -wd4819 win32:QMAKE_CXXFLAGS += /FS #win32:QMAKE_CXXFLAGS += /utf-8 #避免VC编译器关于fopen等应使用fopen_s的安全警告 win32:DEFINES += _CRT_SECURE_NO_WARNINGS4、分享我个人的预编译头文件stable.h//#ifndef STABLE_H //#define STABLE_H // Add C includes here #include <cmath> #include <cstdlib> #include <ctime> #include <iomanip> #include <iostream> #include <math.h> #if defined __cplusplus // Add C++ includes here #include <algorithm> #include <string.h> #include <vector> using namespace std; // Qt includes #include <QtCore> #include <QtGui> #include <QtNetwork> #if (QT_VERSION > QT_VERSION_CHECK(5, 0, 0)) #include <QtWidgets> #endif #ifndef max #define max(x, y) ((x) < (y) ? (y) : (x)) #define min(x, y) ((x) < (y) ? (x) : (y)) #endif //解决UTF-8编码中文乱码的问题 #ifdef _MSC_VER #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #pragma warning(disable : 4819) #endif // _MSC_VER >= 1600 #endif // _MSC_VER //扩展qDebug以文件行列记录信息 #define QLOG_DEBUG(msg) qDebug() << QString("[%1][%2][%3][%4]%5") \ .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz")) \ .arg("DEBUG") \ .arg(QString("%1:%2:%3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__)) \ .arg(QThread::currentThread()->objectName()) \ .arg(msg); #define FIRLOG //FIRLOG::日志开关,注释关闭打印日志 #ifdef FIRLOG #define firecat_log qDebug() << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz") \ << "[DEBUG]" << __FILE__ << __LINE__ << __FUNCTION__ << "msg:" #else #define firecat_log qDebug() #endif #endif //__cplusplus //#endif // STABLE_H5.Qt官网关于qmake和.pro文件详解https://doc.qt.io/https://doc.qt.io/qt-5/cmake-manual.htmlhttps://doc.qt.io/qt-5/qmake-manual.htmlhttps://doc.qt.io/qt-5/qmake-project-files.htmlhttps://doc.qt.io/qt-5/qmake-common-projects.htmlhttps://doc.qt.io/qt-5/qmake-language.htmlhttps://doc.qt.io/qt-5/qmake-precompiledheaders.htmlhttps://doc.qt.io/qt-5/qmake-environment-reference.htmlhttps://doc.qt.io/qt-5/qmake-variable-reference.html 官方.pro文件的变量清单,多关注QMAKE_CXXFLAGSwin32:QMAKE_CXXFLAGS += /FShttps://doc.qt.io/qt-5/qmake-test-function-reference.htmlLog4Qt的基本使用Qt高级——QMake用户指南6.姊妹篇欢迎访问姊妹篇《Qt .pro文件之defineReplace函数的用法,实现lib文件名自动添加后缀"d"》欢迎访问姊妹篇《关于Qt Creator项目中.pro文件中的相对路径》---参考文献https://blog.csdn.net/a15005784320/article/details/98480663————————————————版权声明:本文为CSDN博主「libaineu2004」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/libaineu2004/article/details/89366925
我们知道Visual Studio是可以设置字符集的,有多字节和Unicode两种选项。那么Qt Creator可以吗?可以的,Qt Creator默认是使用Unicode字符集,这个从配置文件可以查看到,例如:D:\Qt\Qt5.9.8\5.9.8\mingw53_32\mkspecs\win32-g++\qmake.confD:\Qt\Qt5.9.8\5.9.8\msvc2015\mkspecs\common\msvc-desktop.conf都有定义DEFINES += UNICODE _UNICODE WIN32那如果想设置成多字节怎么搞?找到QtCreator的.pro工程文件,直接设置即可,比如:DEFINES -= UNICODE
1、方法1删除IDE的配置参数的保存文件夹QtProject,使得Qt Creator恢复出厂值。详情见我的另一篇博客:https://blog.csdn.net/libaineu2004/article/details/383207312、方法2Qt Creator 5.7.0以上版本 ,电脑使用高性能显卡时,使用qtcreator编辑项目会出现假死现象,打开项目会没有反应。在NVIDIA控制面板->3D设置->管理3D设置->程序设置,把Qt Creator单独强制设置为集成显卡就行了,这样全局依然可以选择高性能显卡。即可解决。笔者注:对于没有集成显卡的电脑,方法2无效。
本篇参考了知乎文章https://www.zhihu.com/question/23045749,然后个人精心整理而来,Windows用户请重点关注方法7,效果立竿见影!通常大家会认为Qt Creator的编译速度太慢,太耗时间。容易让人产生误会,即“用Qt写的程序编译比MFC慢”。其实这个说法是错误的。首先,Qt creator只是一个IDE,不是编译器,编译快慢与Qt Creator无关,要看具体使用的是什么编译器和编程方法。事实上,单位代码行数编译Qt远比MFC快得多,因为Qt库的头文件设计非常好,尽量都使用了前置声明,避免了头文件嵌套,几乎所有类都使用了公有类和私有类的设计,把没必要公开的声明放到私有头文件里,避免了编译时引入过多代码。而MFC没有这样的设计。至于大家感觉MFC快主要原因是MFC工程默认打开了编译预处理头文件(PCH),但是这不仅仅是VC编译器的特性,所有C++程序都可以用,不是MFC特有,Qt也可以使用 PCH。方法1:工程.pro文件加入预编译机制,PRECOMPILED_HEADER详情见官网介绍:https://doc.qt.io/qt-5/qmake-precompiledheaders.htmlhttps://doc.qt.io/qt-5/qmake-variable-reference.html#configQt安装路径也有具体的示例,例如笔者的路径是D:\Qt\Qt5.9.8\Examples\Qt-5.9.8\qmake\precompile下面我们说说使用方法,添加预编译头文件(PCH,PreCompiled Headers)支持,在pro文件添加下面代码:# Use Precompiled headers (PCH)CONFIG += precompile_headerPRECOMPILED_HEADER = stable.h# HEADERS += stable.h #这句话是可有可无的,建议加上预编译头文件stable.h包含哪些内容?预编译头文件应该将稳定和静态(例如,Qt库头文件、第三方库头文件、自定义的不经常改动的头文件)的代码包含在你工程中。一个典型的PCH文件类似如下:// #ifndef STABLE_H //Qt官方例子没有定义这个条件编译 // #define STABLE_H // Add C includes here #include <iostream> #if defined __cplusplus // Add C++ includes here #include <vector> // Qt includes #include <QApplication> // #include <QtCore> //请谨慎包含 // #include <QtGui> //请谨慎包含 #include <QObject> #include <qglobal.h> #include <QDir> #include <QIntValidator> #include <QToolTip> #include <QDebug> #include <QMainWindow> #include <QDialog> #include <QFileDialog> #include <QPushButton> #include <QLabel> #include <QLineEdit> #include <QTimer> #include <QtNetwork> #include <QTextCodec> #include <QThread> #include <QtSql> #if (QT_VERSION > QT_VERSION_CHECK(5,0,0)) #include <QtWidgets> #endif #include <QGraphicsScene> #include <QGraphicsItem> #include <QGraphicsPixmapItem> #include <QGraphicsSceneWheelEvent> // Other #include "thirdparty/include/libmain.h" #include "my_stable_class.h" #endif //__cplusplus // #endif // STABLE_H注意:1、如果可以的话,请尽量不要#include <QtCore>和#include <QtGui>,因为这两个头文件涵盖了Qt所有的类,处理他们需要的时间相当长。2、官方文档说,预编译头文件要将C和C++头文件分开,所以使用了#if defined __cplusplus3、我发现Qt官方自带的案例https://github.com/qt/qtbase/blob/5.12/examples/qmake/precompile/stable.h (在本地安装路径也有\Examples\Qt-5.9.8\qmake\precompile),以及Qt Creator的源码https://github.com/qt-creator/qt-creator/blob/master/src/shared/qtcreator_pch.h都没有使用“防止头文件重复包含”的宏定义:言外之意,预编译头文件允许重复包含了?有待确认..fixme..#ifndef STABLE_H#define STABLE_H#endif在.pro文件添加预编译信息之后,qmake将会处理剩下的工作——确保创建和使用预编译头文件。你不需要在.pro文件包含预编译头文件到HEADERS变量中,如果配置了支持PCH,qmake会帮助你完成这些。# HEADERS += stable.h #这句话是可有可无的,建议加上如果是VC++编译器,最终会生成{projectname}_pch.pch文件,大约几十或上百M的预编译头文件。如果是MinGW编译器,最终会生成stable.h.gch文件夹,里面有个C++文件,大约几十或上百M的预编译头文件。未开启Qt的预编译头文件功能时,项目一旦工程数目众多,每个工程中又有很多文件时,每个头文件交叉包含Qt的头文件、第三方头文件、自定义的头文件。一旦启动编译,过程是漫长又痛苦的!开启Qt预编译头文件后,同样的项目编译下来不需要漫长的等待时间,项目即可编译完成。与未使用预编译头文件之前相比,速度上快了10倍以上!4、更详细的.pro文件的配置,请参见我的另一篇博客Qt Creator指定临时文件生成目录(MOC_DIR/RCC_DIR等)和配置.pro文件方法2:启动多核编译1、如果是VS的MSVC编译器,可以在 .pro里加入下面一行QMAKE_CXXFLAGS += /MP指定/mp编译选项,编译器将使用并行编译,同时起多个编译进程并行编译不同的cpp。2、如果是MinGW编译器:项目-》构建设置-》构建步骤-》make详情-》make参数 ,填入-j4,之后编译就飕飕的了,如果处理器八个核填-j8。笔者注:本人发现Qt Creator 4.8.2 (Enterprise)及以上版本已经默认启动了多核编译,无需自己手动设置了。(#^.^#)方法3:添加-r参数(仅针对MinGW有效,VC++无效)QtCreator在windows下用Mingw编译的时候,在正式开始编译前,会卡一段时间,大概10s左右的样子,所以对小工程就可能造成编译速度慢的假象,如果是这个情况,你需要在make和clean的参数选项前加个 “-r” ,这样就会直接开始编译工作,速度马上就会快很多了。方法4:头文件包含,尽量用类的前置声明代替#include例如,头文件include <class_> 改成 class class_详情参见我的另一篇博客:https://blog.csdn.net/libaineu2004/article/details/89207060方法5:Windows用户请采用Visual Studio的msvc编译器,而不是MinGW的gcc编译器。前者比后者编译速度更快。一般来说Windows下就是MinGW的gcc和Visual Studio/MSVC的nmake,在Windows下推荐使用MSVC编译器nmake,能够加快编译速度。MinGW,其实它就是一个移植版本的GCC,的确是不如VC++快的。如果是其它平台,那么编译器可以换成LLVM的clang,那就快很多了。同样的源码,在MacOS编译比Windows要快得多,因为MacOS使用的就是Clang编译器。所以结论:在Windows平台还是尽量用MSVC编译器!另外,有经济条件的话,建议使用MacOS开发,编译快。方法6:关闭360杀毒防护软件的实时扫描功能,或者启用开发者模式,信任编译输出路径。方法7:Windows用户可以使用第三方插件,IncrediBuild for Qt Creator详情参见我的另一篇博客:《提高Qt Creator编译速度的7种方法の扩展篇:IncrediBuild v9.x使用详解,与Qt Creator v4.10搭配提速》其他方法:比如有经济条件的话,使用固态硬盘,这对提升编译速度也很明显。-------------------------------------------------------附录-------------------------------------------------------------题外话:1、解决windows下vc++编译器qDebug()等中文乱码问题,可以在stable.h中添加:#if defined(_MSC_VER) && (_MSC_VER >= 1600) # pragma execution_character_set("utf-8") #endif或者#ifdef _MSC_VER#if _MSC_VER >= 1600#pragma execution_character_set("utf-8")#pragma warning (disable:4819)#endif // _MSC_VER >= 1600#endif // _MSC_VER注意: Qt Creator -> Options -> Text Editor -> Behavior -> File Encodings 更改设置为 "UTF-8",BOM设置为"Add If Encoding Is UTF-8",如果编码是UTF-8则添加。2、场景证明情景一:今天在使用Qt设计界面的时候发现的一个问题,每修改一处代码,就要清理工程、重新构建才可以看到最新的效果项目文件少还好,文件多了,每修改一下就要重新构建一次,特别浪费时间!情景二:由于vc2013开始可以使用"#pragma execution_character_set("UTF-8")"来解决UTF-8编码问题,可是这句话放哪里呢?网上查一查,清一色的都说放在main函数前面,好吧,我放了,但是发现还是会存在乱码的问题。其实网上那些朋友搞错了一个概念,这个命令是在编译时产生作用的,而不是运行时,你放main函数前面根本就没用!你要放在编译器编译的第一个文件中头部,但是问题是你不确定编译器到底从哪个文件开始编译。。。基于以上两个不便之处,预编译头文件的作用就显现出来了!3、笔者发现小问题使用环境是Qt Creator 4.8.2+MSVC2015编译器,编译工程时,有时.pch文件会生成在当前构建目录下,名字是{projectname}_pch.pch;有时会生成在C:\Users\<用户名>\AppData\Local\Temp,而且名字是随机的。奇怪了。。囧4、VC++预编译头文件 – stdafx.h的作用是什么?https://blog.csdn.net/libaineu2004/article/details/914285955、Qt Creator断点调试慢?IDE菜单->工具->选项->构建和运行,在部署项目前总是先构建&在运行项目前总是先部署,这两栏去掉勾选再试试。6、C++库大全https://github.com/fffaraz/awesome-cpp
QLoggingCategory可以控制打印输出类别和区域。方便在调试时,过滤掉不关心的打印信息。QLoggingCategory ClassThe QLoggingCategory class represents a category, or 'area' in the logging infrastructure. More...Header: #include <QLoggingCategory>qmake: QT += coreSince: Qt 5.2https://blog.csdn.net/u010168781/article/details/84667524
一、简介DXF官方帮助:https://help.autodesk.com/view/OARX/2019/ENU/网络可以搜索到非常多的dxf解析博客,但是几乎没有人能完整地实现polyline/spline/ellipse等复杂图形的解析和绘制。因为dxf的解析较为复杂,涉及的元素很多,例如block解析,图形平移,缩放,参照系坐标等等,另外还有polyline/spline/ellipse等复杂图形,而polyline又存在凸度的问题需要解决。dxflib开源库实现了dxf文件的解析。所有的图元解析完后,都会通过DL_CreationAdapter的虚函数接口回调,所以我们要继承这个类,重写想绘制的图元的方法,比如直线对应的就是virtual void addLine(const DL_LineData&); 这个DL_LineData结构体数据保存的就是我们要绘制直线的数据。本人使用dxflib开源库,连续奋战,克服重重困难,终于实现了以下元素的解析和绘制:元素:point、line、circle、arc、polyline、spline、ellipse、text其他:layer、block、insert、min、max绘制图形,使用了opencv,把dxf转化成为png文件。以下举例说明:图1:涵盖了上述的所有元素图2:椭圆和样条曲线图3:polyLine多线实体,注意四个角的倒角圆弧,就是凸度计算得来图4:图形旋转平移缩放的经典案例二、DXF Spline的格式说明Group codes Description Subclass marker (AcDbSpline) Normal vector (omitted if the spline is nonplanar) DXF: X value; APP: 3D vector 220, 230 DXF: Y and Z values of normal vector Spline flag (bit coded): 1 = Closed spline 2 = Periodic spline 4 = Rational spline 8 = Planar 16 = Linear (planar bit is also set) Degree of the spline curve Number of knots Number of control points Number of fit points (if any) Knot tolerance (default = 0.0000001) Control-point tolerance (default = 0.0000001) Fit tolerance (default = 0.0000000001) Start tangent--may be omitted (in WCS). DXF: X value; APP: 3D point. 22, 32 DXF: Y and Z values of start tangent--may be omitted (in WCS). End tangent--may be omitted (in WCS). DXF: X value; APP: 3D point. 23, 33 DXF: Y and Z values of end tangent--may be omitted (in WCS) Knot value (one entry per knot) Weight (if not 1); with multiple group pairs, are present if all are not 1 Control points (in WCS) one entry per control point. DXF: X value; APP: 3D point 20, 30 DXF: Y and Z values of control points (in WCS) (one entry per control point) Fit points (in WCS) one entry per fit point. DXF: X value; APP: 3D point 21, 31 DXF: Y and Z values of fit points (in WCS) (one entry per fit point) ----------------------------------------中文说明:--------------------------------- 样条曲线组码 子类标记 (AcDbSpline) 法向矢量(如果样条曲线为非平面型,则省略) DXF:X 值;APP:三维矢量 220, 230 DXF:法向矢量的 Y 值和 Z 值(可选) 样条曲线标志(按位编码): 1 = 闭合样条曲线 2 = 周期样条曲线 4 = 有理样条曲线 8 = 平面 16 = 线性(同时设置平面位) 样条曲线的阶数 拟合点数(如果有) 节点公差(默认值 = 0.0000001) 控制点公差(默认值 = 0.0000001) 拟合公差(默认值 = 0.0000000001) 起点切向 — 可以省略(在 WCS 中) DXF:X 值;APP:三维点 22, 32 DXF:起点切向的 Y 值和 Z 值 — 可以省略(在 WCS 中) 端点切向 — 可以省略(在 WCS 中) DXF:X 值;APP:三维点 23, 33 DXF:端点切向的 Y 值和 Z 值 — 可以省略(在 WCS 中) 节点值(每个节点一个条目) 权值(如果不为 1);对于多组对,如果均不为 1,则出现。 控制点(在 WCS 中);每个控制点一个条目 DXF:X 值;APP:三维点 20, 30 DXF:控制点的 Y 值和 Z 值(在 WCS 中);每个控制点一个条目 拟合点(在 WCS 中);每个拟合点一个条目 DXF:X 值;APP:三维点 21, 31 DXF:拟合点的 Y 值和 Z 值(在 WCS 中);每个拟合点一个条目
网上有很多博客介绍使用Halcon库,在MFC界面打开显示图片。图片显示在静态图片控件,STATIC PICTURE CTRL。但是网上的案例都没有实现多次点击"打开"按钮,使得可以在PIC控件里显示不同的图片;即,打开一张图片可以显示在PIC控件,再打开第二张图片时,PIC控件没有刷新,还是显示第一张图。这里笔者分享一下自己的方法,我和他们的不同之处在于实现了C++异常处理和连续打开并显示不同的图片://构造文件对话框对象 CFileDialog readfileDlg(TRUE, NULL, NULL, 0, _T("图像文件(*.bmp)|*.bmp||"), this); if (IDOK == readfileDlg.DoModal()) m_strPathTemplateOk = readfileDlg.GetPathName(); //声明标识,函数T2A和W2A均支持ATL和MFC中的字符 USES_CONVERSION; std::string s(W2A(m_strPathTemplateOk)); const char *filename = s.c_str(); ReadImage(&m_ImageOK, filename);//文件如果不存在会抛出异常 catch (HException* e)//很奇怪,这里捕获不到 UNUSED_PARAMETER(e); return FALSE; catch (...)//能处理任何异常的代码 return FALSE; if (!m_ImageOK.IsInitialized()) return FALSE; HTuple width, height; GetImageSize(m_ImageOK, &width, &height); CRect rect; HWND hImgWnd = GetDlgItem(IDC_STATIC_PIC_TEMPLATE)->m_hWnd; GetDlgItem(IDC_STATIC_PIC_TEMPLATE)->GetClientRect(&rect); if (HDevWindowStack::IsOpen()) close_window(HDevWindowStack::Pop());//这段话很重要,否则无法连续打开图像显示,仅仅固定显示第一幅图 HTuple hv_WindowHandle; OpenWindow(rect.left, rect.top, rect.Width(), rect.Height(), (Hlong)hImgWnd, "visible", "", &hv_WindowHandle); HDevWindowStack::Push(hv_WindowHandle);//这段话很重要,否则无法连续打开图像显示,仅仅固定显示第一幅图 SetPart(hv_WindowHandle, 0, 0, height, width);//设置显示的图像范围 DispObj(m_ImageOK, hv_WindowHandle); 不需要依赖动态库文件hcanvas.dll,只需要halcon.dll和halconcpp.dll这两个即可。---姊妹篇:《使用Halcon库,在Qt界面打开显示图片,可实现多次打开不同图片》https://libaineu2004.blog.csdn.net/article/details/113925024
一、先来看例子今天看别人写的代码,用到了QTreeWidgetItem,这是QT自带的类,但是并没有#include<QTreeWidgetItem>而是在头文件里写了类的声明:然后用到这个类的函数接口:你看用到的都是指针!原来是因为当你在头文件声明成员变量或成员函数时,如果只需要用到某个类的指针而不需要用到类的对象,那么就可以直接只是声明一下这个类,不用include,这样可以避免编译时include编译这个类。但是cpp实现文件里是需要include类的。这样的方法同样适用于自己写的类:二、再来看Google的文档说明https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/headers/#forward-declarations定义:所谓「前置声明」(forward declaration)是类、函数和模板的纯粹声明,没伴随着其定义.优点:前置声明能够节省编译时间,多余的 #include 会迫使编译器展开更多的文件,处理更多的输入。前置声明能够节省不必要的重新编译的时间。 #include 使代码因为头文件中无关的改动而被重新编译多次。缺点:前置声明隐藏了依赖关系,头文件改动时,用户的代码会跳过必要的重新编译过程。前置声明可能会被库的后续更改所破坏。前置声明函数或模板有时会妨碍头文件开发者变动其 API. 例如扩大形参类型,加个自带默认参数的模板形参等等。前置声明来自命名空间 std:: 的 symbol 时,其行为未定义。很难判断什么时候该用前置声明,什么时候该用 #include 。极端情况下,用前置声明代替 includes 甚至都会暗暗地改变代码的含义: // b.h:struct B {};struct D : B {};// good_user.cc:#include "b.h"void f(B*);void f(void*);void test(D* x) { f(x); } // calls f(B*)如果 #include 被 B 和 D 的前置声明替代, test() 就会调用 f(void*) .前置声明了不少来自头文件的 symbol 时,就会比单单一行的 include 冗长。仅仅为了能前置声明而重构代码(比如用指针成员代替对象成员)会使代码变得更慢更复杂.结论:尽量避免前置声明那些定义在其他项目中的实体.函数:总是使用 #include.类模板:优先使用 #include.---参考文献https://blog.csdn.net/weixin_40098626/article/details/80117901
![]() |
乐观的松球 · vue i18n 占位符-掘金 1 年前 |