单一本地门户网站源码,帮人做网站在徐州被敲诈五万,旅游网页设计作业,用ipv6地址做网站访问文章目录 1. 概论2. 详论2.1 创建工程2.2 加载工程2.3 配置文件2.4 工程配置2.5 调试执行 3. 项目案例4. 总结 1. 概论
在之前的系列博文中#xff0c;我们学习了如何构建第三方的依赖库#xff0c;也学习了如何去组建自己的CMake项目#xff0c;尤其是学习了CMake的核心配… 文章目录 1. 概论2. 详论2.1 创建工程2.2 加载工程2.3 配置文件2.4 工程配置2.5 调试执行 3. 项目案例4. 总结 1. 概论
在之前的系列博文中我们学习了如何构建第三方的依赖库也学习了如何去组建自己的CMake项目尤其是学习了CMake的核心配置文件CMakeLists.txt如何编写。长期以来CMakeLists.txt这个文件都是C/C项目额外编写的然后使用CMake指令或者GUI工具配置成Windows下的MSVC工程或者Linux下的Makefile文件。这样做虽然对比之前需要不同的平台下要使用不同的工程有了长足的进步但是还可以再进一步那就是直接在IDE中使用CMake工程进行开发这样无疑对C/C程序开发的效率有质的提升。
从Visual Studio 2017开始Microsoft Visual Studio简称VS就开始支持CMake工程的导入。所谓CMake工程指的就是不再需要建立传统的MSVC项目例如.sln或者.vcxproj工程文件而是直接使用CMakeLists.txt作为工程配置文件来进行加载进行进行构建和开发的工作。不仅是VS目前其他IDE比如Visual Studio Code、Qt Creator、IntelliJ IDEA、 CLion都能直接支持CMake工程的导入。但是作为初学者笔者还是建议从Microsoft Visual Studio入手进行CMake项目的开发毕竟号称宇宙第一的IDE不是白叫的。以笔者的观点来看Microsoft Visual Studio的确实有点重编辑器也不是最美观的UI操作也不一定是最人性化的但是其提供的调试功能却是最优秀且不可或缺的尤其适合商业中的生产力环境。这里笔者就以Visual Studio 2019 为例详细讲解一下如何进行CMake项目的开发以提升我们的C/C程序开发效率。
2. 详论
2.1 创建工程
启动Visual Studio 2019弹出的启动页面如下图1所示 点击右下方“创建新项目”按钮进入“创建新项目”页面如下图2所示 选择“CMake项目”的模板如果没有看到可以搜索一下模板。点击“下一步”按钮进入“配置新项目”页面如下图3所示 在“配置新项目”页面填入项目名称和位置点击“创建”按钮就进入了Visual Studio 2019的主要工作页面如下图4所示 2.2 加载工程
关闭Visual Studio 2019模拟一下直接加载现有CMake工程的情况。再次启动Visual Studio 2019一般在图1所示的启动页面中可以看到上次加载过的历史记录点击就可以再次进行加载了。但是如何没有历史记录就点击“继续但无需代码”按钮直接进入主页面。在菜单栏中依次选择文件-打开-CMake按钮如下图5所示 此时会弹出“打开CMake项目”对话框选中项目中的CMakeList.txt文件CMake项目就是通过这个核心配置文件来打开的如下图6所示 记住一定要通过这种方式打开CMakeList.txt文件才会打开CMake项目如果直接将CMakeList.txt文件拖入到Visual Studio 2019主页面中只会文本形式显示CMakeList.txt。
2.3 配置文件
接下来再正式进行开发之前我们需要先搞定一个配置文件CMakePresets.json。CMakeList.txt具有非常多的配置项或者需要传入的外部参数需要使用一个配置文件来进行管理。不过麻烦就麻烦在这里CMakePresets.json是CMake 3.20引入的是个相对较新的功能Visual Studio 2019并没有一开始就对接这个配置文件而是使用自己设计的CMakeSettings.json文件作为CMake构建项目的配置。目前这两种配置文件Visual Studio 2019都支持但是更推荐使用CMakePresets.json因为更加标准化符合CMake的规范可以被多种IDE和构建工具识别和支持。
具体来说如果程序主页面尤其是主页面的工具栏与下图7有所不同 那么可以在菜单栏依次选择工具-选项-CMake-常规勾选“首次使用CMake预设值进行配置、构建和测试”的单选框如下图8所示 点击工具栏的配置下拉菜单选择“管理配置”按钮如下图9所示 此时Visual Studio 2019就会自动创建CMakeSettings.json配置文件如下图10所示 从这个文件可以看到默认的windows-default配置其实是Debug模式我们可以将其增加一个RelWithDebInfo模式也就是Release带调试信息模式CMakePresets.json具体的内容为
{version: 2,configurePresets: [{name: linux-default,displayName: Linux Debug,description: 面向适用于 Linux 的 Windows 子系统(WSL)或远程 Linux 系统。,generator: Ninja,binaryDir: ${sourceDir}/out/build/${presetName},cacheVariables: {CMAKE_BUILD_TYPE: Debug,CMAKE_INSTALL_PREFIX: ${sourceDir}/out/install/${presetName}},vendor: {microsoft.com/VisualStudioSettings/CMake/1.0: { hostOS: [ Linux ] },microsoft.com/VisualStudioRemoteSettings/CMake/1.0: { sourceDir: $env{HOME}/.vs/$ms{projectDirName} }}},{name: windows-default,displayName: Windows x64 Debug,description: 面向具有 Visual Studio 开发环境的 Windows。,generator: Ninja,binaryDir: ${sourceDir}/out/build/${presetName},architecture: {value: x64,strategy: external},cacheVariables: {CMAKE_BUILD_TYPE: Debug,CMAKE_INSTALL_PREFIX: ${sourceDir}/out/install/${presetName}},vendor: { microsoft.com/VisualStudioSettings/CMake/1.0: { hostOS: [ Windows ] } }},{name: RelWithDebInfo,displayName: Windows x64 RelWithDebInfo Shared Library,description: 面向具有 Visual Studio 开发环境的 Windows。,generator: Ninja,binaryDir: ${sourceDir}/out/build/${presetName},architecture: {value: x64,strategy: external},cacheVariables: {CMAKE_BUILD_TYPE: RelWithDebInfo,CMAKE_INSTALL_PREFIX: ${sourceDir}/out/install/${presetName}},vendor: { microsoft.com/VisualStudioSettings/CMake/1.0: { hostOS: [ Windows ] } }}]
}添加这段配置并CtrlS保存之后工具栏的配置下拉菜单就会多了RelWithDebInfo这个选项将其选中如下图11所示 注意有的时候因为两种配置方式的冲突问题会导致一些异常现象比如工具栏的配置菜单不太一样。如果遇到这种情况可以推出Visual Studio 2019清理工程的中间生成文件再重新加载工程试试。
2.4 工程配置
再接下来的步骤不要急着去编写源代码文件要先完成CMakeLists.txt的编写。新建工程的CMakeLists.txt会有一段默认的内容如下所示
# CMakeList.txt: ZipTest 的 CMake 项目在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)project (ZipTest)# 将源代码添加到此项目的可执行文件。
add_executable (ZipTest ZipTest.cpp ZipTest.h)# TODO: 如有需要请添加测试并安装目标。如果我们学习过上一篇博文的话就会理解这段配置代码文件推荐读者复习一下。这里要说的关键是在修改CMakeLists.txt文件之后需要CtrlS保存一下Visual Studio 2019就会自动进行工程配置可以在输出窗口看到一些输出信息
1 已为配置“RelWithDebInfo”启动 CMake 生成。
1 环境设置:
1 CommandPromptTypeNative
1 DevEnvDirC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\
1 ExtensionSdkDirC:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs
1 Framework40Versionv4.0
1 FrameworkDirC:\windows\Microsoft.NET\Framework64\
1 FrameworkDIR64C:\windows\Microsoft.NET\Framework64
1 FrameworkVersionv4.0.30319
1 FrameworkVersion64v4.0.30319
1 HTMLHelpDirC:\Program Files (x86)\HTML Help Workshop
1 IFCPATHC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\ifc\x64
1 IGCCSVC_DBAQAAANCMnd8BFdERjHoAwE/ClsBAAAAggkwNDDGDkq0HFOUjEsXQAQAAAACAAAAAAAQZgAAAAEAACAAAADxjk35GiqLjZDHeYjx5dq8wxmbU7aEbBW9J68TO/bzIwAAAAAOgAAAAAIAACAAAADdM3gyHGrxXOwEEyHmxfe9ocZnP6CM0OTQGZYVZKgQWmAAAAC8xGVDuFoU062/gozauvaMPUmsT8FAuEXoLnI9lTwHVT6XWpjF7lVBoYBvxo1dgIUAtW0nl1wZSUg9KRxmYpIicPPLm7BtwKXEdbaDMIu55E10uazKjjvoHY/4KYutAAAAAoK95FWIYAE3fYLjfb3S77ZMJXFw69cRlxyTYekzkyfOFdUcCY94ahVXHEgao2y8e/zTq2zHU0SqXho0LDQ
1 INCLUDEC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\ATLMFC\include;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.22000.0\ucrt;C:\Program Files (x86)\Windows Kits\10\include\10.0.22000.0\shared;C:\Program Files (x86)\Windows Kits\10\include\10.0.22000.0\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.22000.0\winrt;C:\Program Files (x86)\Windows Kits\10\include\10.0.22000.0\cppwinrt
1 LIBC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\ATLMFC\lib\x64;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\lib\x64;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64;C:\Program Files (x86)\Windows Kits\10\lib\10.0.22000.0\ucrt\x64;C:\Program Files (x86)\Windows Kits\10\lib\10.0.22000.0\um\x64
1 LIBPATHC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\ATLMFC\lib\x64;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\lib\x64;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\lib\x86\store\references;C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.22000.0;C:\Program Files (x86)\Windows Kits\10\References\10.0.22000.0;C:\windows\Microsoft.NET\Framework64\v4.0.30319
1 NETFXSDKDirC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\
1 PathC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\\Extensions\Microsoft\IntelliCode\CLI;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\VC\VCPackages;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\bin\Roslyn;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Team Tools\Performance Tools\x64;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Team Tools\Performance Tools;C:\Program Files (x86)\Microsoft Visual Studio\Shared\Common\VSPerfCollectionTools\vs2019\\x64;C:\Program Files (x86)\Microsoft Visual Studio\Shared\Common\VSPerfCollectionTools\vs2019\;C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\devinit;C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64;C:\Program Files (x86)\Windows Kits\10\bin\x64;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\\MSBuild\Current\Bin;C:\windows\Microsoft.NET\Framework64\v4.0.30319;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\Program Files\HP\OMEN-Broadcast\Common;C:\Program Files\CMake\bin;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\TortoiseGit\bin;C:\Work\3rdparty\bin;C:\SoftWare\Qt\Qt5.12.5\5.12.5\msvc2017_64\bin;C:\File\MyGitHub\GISBasic\3rdParty\bin;C:\Program Files\dotnet\;C:\Work\eGova3rdParty\protobuf\bin;C:\Program Files\Java\jdk1.8.0_271\bin;C:\Program Files\KTX-Software\bin;C:\SoftWare\sonar-scanner-msbuild;C:\Program Files\Cppcheck;C:\SoftWare\sonar-scanner-msbuild\sonar-scanner-4.7.0.2747\bin;C:\SoftWare\apache-ant-1.10.8\bin;C:\Program Files (x86)\pcsuite\;C:\SoftWare\apache-maven-3.6.2\bin;C:\Program Files\7-Zip;C:\Program Files\Git\cmd;C:\SoftWare\nvm;C:\Program Files\nodejs;C:\SoftWare\Python\Python311\Scripts\;C:\SoftWare\Python\Python311\;C:\Users\Charlee\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Microsoft VS Code\bin;C:\Users\Charlee\AppData\Local\GitHubDesktop\bin;C:\Users\Charlee\AppData\Roaming\npm;C:\SoftWare\nvm;C:\Program Files\nodejs;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\CMake\Ninja;C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\VC\Linux\bin\ConnectionManagerExe
1 PROMPT$P$G
1 UCRTVersion10.0.22000.0
1 UniversalCRTSdkDirC:\Program Files (x86)\Windows Kits\10\
1 VCIDEInstallDirC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\VC\
1 VCINSTALLDIRC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\
1 VCToolsInstallDirC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\
1 VCToolsRedistDirC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Redist\MSVC\14.29.30133\
1 VCToolsVersion14.29.30133
1 VS160COMNTOOLSC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\
1 VSCMD_ARG_app_platDesktop
1 VSCMD_ARG_HOST_ARCHx64
1 VSCMD_ARG_no_logo1
1 VSCMD_ARG_TGT_ARCHx64
1 VSCMD_DEBUG5
1 VSCMD_VER16.11.29
1 VSINSTALLDIRC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\
1 WindowsLibPathC:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.22000.0;C:\Program Files (x86)\Windows Kits\10\References\10.0.22000.0
1 WindowsSdkBinPathC:\Program Files (x86)\Windows Kits\10\bin\
1 WindowsSdkDirC:\Program Files (x86)\Windows Kits\10\
1 WindowsSDKLibVersion10.0.22000.0\
1 WindowsSdkVerBinPathC:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\
1 WindowsSDKVersion10.0.22000.0\
1 WindowsSDK_ExecutablePath_x64C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64\
1 WindowsSDK_ExecutablePath_x86C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\
1 __devinit_pathC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\devinit\devinit.exe
1 __DOTNET_ADD_64BIT1
1 __DOTNET_PREFERRED_BITNESS64
1 __VSCMD_PREINIT_PATHC:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\Program Files\HP\OMEN-Broadcast\Common;C:\Program Files\CMake\bin;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\TortoiseGit\bin;C:\Work\3rdparty\bin;C:\SoftWare\Qt\Qt5.12.5\5.12.5\msvc2017_64\bin;C:\File\MyGitHub\GISBasic\3rdParty\bin;C:\Program Files\dotnet\;C:\Work\eGova3rdParty\protobuf\bin;C:\Program Files\Java\jdk1.8.0_271\bin;C:\Program Files\KTX-Software\bin;C:\SoftWare\sonar-scanner-msbuild;C:\Program Files\Cppcheck;C:\SoftWare\sonar-scanner-msbuild\sonar-scanner-4.7.0.2747\bin;C:\SoftWare\apache-ant-1.10.8\bin;C:\Program Files (x86)\pcsuite\;C:\SoftWare\apache-maven-3.6.2\bin;C:\Program Files\7-Zip;C:\Program Files\Git\cmd;C:\SoftWare\nvm;C:\Program Files\nodejs;C:\SoftWare\Python\Python311\Scripts\;C:\SoftWare\Python\Python311\;C:\Users\Charlee\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Microsoft VS Code\bin;C:\Users\Charlee\AppData\Local\GitHubDesktop\bin;C:\Users\Charlee\AppData\Roaming\npm;C:\SoftWare\nvm;C:\Program Files\nodejs
1 __VSCMD_script_err_count0
1 HOMEPATH\Users\Charlee
1 DriverDataC:\Windows\System32\Drivers\DriverData
1 COMPUTERNAMELAPTOP-K38HMG48
1 CommonProgramFiles(x86)C:\Program Files (x86)\Common Files
1 POSTGIS_GDAL_ENABLED_DRIVERSENABLE_ALL
1 ProgramW6432C:\Program Files
1 OneDriveC:\Users\Charlee\OneDrive
1 __PSLockDownPolicy0
1 RegionCodeAPJ
1 DEVECOSTUDIO_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\devecostudio.vmoptions
1 VisualStudioEditionMicrosoft Visual Studio Enterprise 2019
1 WEBIDE_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\webide.vmoptions
1 ServiceHubLogSessionKey3AFDCD75
1 PROCESSOR_REVISIONb701
1 PROCESSOR_IDENTIFIERIntel64 Family 6 Model 183 Stepping 1, GenuineIntel
1 PATHEXT.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
1 PkgDefApplicationConfigFileC:\Users\Charlee\AppData\Local\Microsoft\VisualStudio\16.0_36d14652\devenv.exe.config
1 JETBRAINS_CLIENT_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\jetbrains_client.vmoptions
1 PROJ_LIBC:\Program Files\PostgreSQL\16\share\contrib\postgis-3.4\proj
1 CURL_CA_BUNDLEC:\Program Files\PostgreSQL\16\ssl\certs\ca-bundle.crt
1 TMPC:\Users\Charlee\AppData\Local\Temp
1 DATAGRIP_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\datagrip.vmoptions
1 TEMPC:\Users\Charlee\AppData\Local\Temp
1 LOCALAPPDATAC:\Users\Charlee\AppData\Local
1 PUBLICC:\Users\Public
1 eGova3rdPartyC:\Work\3rdparty
1 GDAL_DATAC:\Program Files\PostgreSQL\16\gdal-data
1 PSModulePathC:\Program Files\WindowsPowerShell\Modules;C:\windows\system32\WindowsPowerShell\v1.0\Modules
1 ProgramDataC:\ProgramData
1 JAVA_HOMEC:\Program Files\Java\jdk1.8.0_271
1 USERDOMAINLAPTOP-K38HMG48
1 platformcodeM7
1 PROCESSOR_LEVEL6
1 NUMBER_OF_PROCESSORS32
1 PHPSTORM_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\phpstorm.vmoptions
1 STUDIO_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\studio.vmoptions
1 VSAPPIDDIRC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\
1 ProgramFiles(x86)C:\Program Files (x86)
1 FPS_BROWSER_USER_PROFILE_STRINGDefault
1 CommonProgramFilesC:\Program Files (x86)\Common Files
1 VS140COMNTOOLSC:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\
1 USERDOMAIN_ROAMINGPROFILELAPTOP-K38HMG48
1 VisualStudioDirC:\Users\Charlee\Documents\Visual Studio 2019
1 IGCCSVC_DBAQAAANCMnd8BFdERjHoAwE/ClsBAAAAggkwNDDGDkq0HFOUjEsXQAQAAAACAAAAAAAQZgAAAAEAACAAAADxjk35GiqLjZDHeYjx5dq8wxmbU7aEbBW9J68TO/bzIwAAAAAOgAAAAAIAACAAAADdM3gyHGrxXOwEEyHmxfe9ocZnP6CM0OTQGZYVZKgQWmAAAAC8xGVDuFoU062/gozauvaMPUmsT8FAuEXoLnI9lTwHVT6XWpjF7lVBoYBvxo1dgIUAtW0nl1wZSUg9KRxmYpIicPPLm7BtwKXEdbaDMIu55E10uazKjjvoHY/4KYutAAAAAoK95FWIYAE3fYLjfb3S77ZMJXFw69cRlxyTYekzkyfOFdUcCY94ahVXHEgao2y8e/zTq2zHU0SqXho0LDQ
1 GISBasicC:\File\MyGitHub\GISBasic\3rdParty
1 VSLS_SESSION_KEEPALIVE_INTERVAL0
1 MAVEN_HOMEC:\SoftWare\apache-maven-3.6.2
1 ProgramFilesC:\Program Files (x86)
1 RUBYMINE_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\rubymine.vmoptions
1 APPCODE_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\appcode.vmoptions
1 FPS_BROWSER_APP_PROFILE_STRINGInternet Explorer
1 VSSKUEDITIONEnterprise
1 OnlineServicesOnline Services
1 ThreadedWaitDialogDpiContext-4
1 IDEA_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\idea.vmoptions
1 WEBSTORM_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\webstorm.vmoptions
1 GOLAND_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\goland.vmoptions
1 NVM_SYMLINKC:\Program Files\nodejs
1 NVM_HOMEC:\SoftWare\nvm
1 SESSIONNAMEConsole
1 VisualStudioVersion16.0
1 SystemRootC:\windows
1 CommonProgramW6432C:\Program Files\Common Files
1 ZES_ENABLE_SYSMAN1
1 LOGONSERVER\\LAPTOP-K38HMG48
1 VSAPPIDNAMEdevenv.exe
1 USERPROFILEC:\Users\Charlee
1 MSBuildLoadMicrosoftTargetsReadOnlytrue
1 QtMsBuildC:\Users\Charlee\AppData\Local\QtMsBuild
1 POSTGIS_ENABLE_OUTDB_RASTERS1
1 VSLANG2052
1 RIDER_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\rider.vmoptions
1 APPDATAC:\Users\Charlee\AppData\Roaming
1 HOMEDRIVEC:
1 DATASPELL_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\dataspell.vmoptions
1 GATEWAY_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\gateway.vmoptions
1 CLION_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\clion.vmoptions
1 JETBRAINSCLIENT_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\jetbrainsclient.vmoptions
1 USERNAMECharlee
1 PROCESSOR_ARCHITEW6432AMD64
1 EFC_203361
1 PROCESSOR_ARCHITECTUREx86
1 OSWindows_NT
1 ComSpecC:\windows\system32\cmd.exe
1 PYCHARM_VM_OPTIONSC:\SoftWare\ideaI-windows\2023\vmoptions\pycharm.vmoptions
1 SystemDriveC:
1 windirC:\windows
1 ALLUSERSPROFILEC:\ProgramData
1 命令行: C:\windows\system32\cmd.exe /c %SYSTEMROOT%\System32\chcp.com 65001 NUL C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\ENTERPRISE\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\CMake\bin\cmake.exe -G Ninja -DCMAKE_BUILD_TYPE:STRINGRelWithDebInfo -DCMAKE_INSTALL_PREFIX:STRINGC:/Work/ZipTest/out/install/RelWithDebInfo -DCMAKE_MAKE_PROGRAMC:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\ENTERPRISE\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\Ninja\ninja.exe C:\Work\ZipTest 21
1 工作目录: C:/Work/ZipTest/out/build/RelWithDebInfo
1 [CMake] -- Configuring done
1 [CMake] -- Generating done
1 [CMake] -- Build files have been written to: C:/Work/ZipTest/out/build/RelWithDebInfo
1 已提取 CMake 变量。
1 已提取源文件和标头。
1 已提取代码模型。
1 已提取工具链配置。
1 已提取包含路径。
1 CMake 生成完毕。这个配置工程的步骤一定不能少且要保证看到“CMake生成完毕”的提示。如果生成中断的话可以在输出日志中看到出错的地方并进行修改。本质上来说CMakeLists.txt只是个文本文件而已要通过这一步将构建的环境准备好生成一些缓存文件和中间文件从而便于构建工具链识别进行下一步作业。
2.5 调试执行
在保证CMake配置工程完毕之后就可以进行调试运行了。这一步的功能就无缝对接MSVC项目了例如编辑代码F7生成F5调试CtrlF5执行F9断点F10逐过程调试以及F11逐语句调试。不过有一点要注意就是要选择启动项不然可能无法运行项目。具体可以在工具栏的选择启动项下拉菜单中如下图12所示 我们当然要选中ZipTest.exe这个目标不过一定要注意只有当CMake生成完毕以后才会出现这个选项。如果没有这个选项那就说明之前的CMake生成没有成功。
另外一个很实用的功能是在CMake生成成功以后可以切换到CMake目标项目。具体通过“解决资源管理器视图”的工具栏上的“在解决方案和可用视图之间切换”按钮进入如下图13所示 这个视图看起来有点像MSVC工程了比文件夹视图简洁介多了。更重要的是由这个视图的右键菜单功能更实用一点比如“设为启动项”按钮也可以实现上面的选择启动项功能。另外还有“添加”功能与MSVC项目的“添加”功能类似可以新建源代码文件加入到CMake工程中。不过这个功能是通过修改CMakeList.txt文件来实现的读者可以自己试用一下。 其实笔者感觉这个CMake目标视图是想像MSVC工程一样集成更多的常用GUI操作的功能使得开发编程的效率更高。不过目前这些还只是半成品比如这个“添加”功能是可以实现源代码文件的添加了但是对应修改CMakeList.txt的内容不一定是我们想要的关于这一点读者可以试用一段时间之后再领会。目前很多常用的IDE功能还是需要我们自己编辑CMakeList.txt文件来实现尽管如此已经可以帮助我们提升很大一部分开发效率了。
3. 项目案例
默认的Hello CMake案例还是太简单了我们还是将上一篇的调用libzip压缩文件和文件夹的案例用上。项目目录如下
ZipTest
│ main.cpp
│ CMakeLists.txt
| CMakePresets.jsonmain.cpp的内容如下
#include zip.h#include filesystem
#include fstream
#include iostreamusing namespace std;void CompressFile2Zip(std::filesystem::path unZipFilePath,const char* relativeName, zip_t* zipArchive) {std::ifstream file(unZipFilePath, std::ios::binary);file.seekg(0, std::ios::end);size_t bufferSize file.tellg();char* bufferData (char*)malloc(bufferSize);file.seekg(0, std::ios::beg);file.read(bufferData, bufferSize);//第四个参数如果非0会自动托管申请的资源直到zip_close之前自动销毁。zip_source_t* source zip_source_buffer(zipArchive, bufferData, bufferSize, 1);if (source) {if (zip_file_add(zipArchive, relativeName, source, ZIP_FL_OVERWRITE) 0) {std::cerr Failed to add file unZipFilePath to zip: zip_strerror(zipArchive) std::endl;zip_source_free(source);}} else {std::cerr Failed to create zip source for unZipFilePath : zip_strerror(zipArchive) std::endl;}
}void CompressFile(std::filesystem::path unZipFilePath,std::filesystem::path zipFilePath) {int errorCode 0;zip_t* zipArchive zip_open(zipFilePath.generic_u8string().c_str(),ZIP_CREATE | ZIP_TRUNCATE, errorCode);if (zipArchive) {CompressFile2Zip(unZipFilePath, unZipFilePath.filename().string().c_str(),zipArchive);errorCode zip_close(zipArchive);if (errorCode ! 0) {zip_error_t zipError;zip_error_init_with_code(zipError, errorCode);std::cerr zip_error_strerror(zipError) std::endl;zip_error_fini(zipError);}} else {zip_error_t zipError;zip_error_init_with_code(zipError, errorCode);std::cerr Failed to open output file zipFilePath : zip_error_strerror(zipError) std::endl;zip_error_fini(zipError);}
}void CompressDirectory2Zip(std::filesystem::path rootDirectoryPath,std::filesystem::path directoryPath,zip_t* zipArchive) {if (rootDirectoryPath ! directoryPath) {if (zip_dir_add(zipArchive,std::filesystem::relative(directoryPath, rootDirectoryPath).generic_u8string().c_str(),ZIP_FL_ENC_UTF_8) 0) {std::cerr Failed to add directory directoryPath to zip: zip_strerror(zipArchive) std::endl;}}for (const auto entry : std::filesystem::directory_iterator(directoryPath)) {if (entry.is_regular_file()) {CompressFile2Zip(entry.path().generic_u8string(),std::filesystem::relative(entry.path(), rootDirectoryPath).generic_u8string().c_str(),zipArchive);} else if (entry.is_directory()) {CompressDirectory2Zip(rootDirectoryPath, entry.path().generic_u8string(),zipArchive);}}
}void CompressDirectory(std::filesystem::path directoryPath,std::filesystem::path zipFilePath) {int errorCode 0;zip_t* zipArchive zip_open(zipFilePath.generic_u8string().c_str(),ZIP_CREATE | ZIP_TRUNCATE, errorCode);if (zipArchive) {CompressDirectory2Zip(directoryPath, directoryPath, zipArchive);errorCode zip_close(zipArchive);if (errorCode ! 0) {zip_error_t zipError;zip_error_init_with_code(zipError, errorCode);std::cerr zip_error_strerror(zipError) std::endl;zip_error_fini(zipError);}} else {zip_error_t zipError;zip_error_init_with_code(zipError, errorCode);std::cerr Failed to open output file zipFilePath : zip_error_strerror(zipError) std::endl;zip_error_fini(zipError);}
}int main() {//压缩文件// CompressFile(C:/Data/Builder/Demo/view.tmp,// C:/Data/Builder/Demo/view.zip);//压缩文件夹CompressDirectory(C:/Data/Builder/Demo, C:/Data/Builder/Demo.zip);return 0;
}CMakeLists.txt的内容如下
# 输出cmake版本提示
message(STATUS The CMAKE_VERSION is ${CMAKE_VERSION}.)# cmake的最低版本要求
cmake_minimum_required (VERSION 3.9)# 工程名称、版本、语言
project (ZipTest VERSION 0.1 LANGUAGES CXX)# cpp17支持
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 查找依赖库
find_package(libzip REQUIRED)# 将源代码添加到此项目的可执行文件。
add_executable (${PROJECT_NAME} main.cpp)# 链接依赖库
target_link_libraries(${PROJECT_NAME} PRIVATE libzip::zip)CMakePresets.json的内容如下
{version: 2,configurePresets: [{name: linux-default,displayName: Linux Debug,description: 面向适用于 Linux 的 Windows 子系统(WSL)或远程 Linux 系统。,generator: Ninja,binaryDir: ${sourceDir}/out/build/${presetName},cacheVariables: {CMAKE_BUILD_TYPE: Debug,CMAKE_INSTALL_PREFIX: ${sourceDir}/out/install/${presetName}},vendor: {microsoft.com/VisualStudioSettings/CMake/1.0: { hostOS: [ Linux ] },microsoft.com/VisualStudioRemoteSettings/CMake/1.0: { sourceDir: $env{HOME}/.vs/$ms{projectDirName} }}},{name: windows-default,displayName: Windows x64 Debug,description: 面向具有 Visual Studio 开发环境的 Windows。,generator: Ninja,binaryDir: ${sourceDir}/out/build/${presetName},architecture: {value: x64,strategy: external},cacheVariables: {CMAKE_BUILD_TYPE: Debug,CMAKE_INSTALL_PREFIX: ${sourceDir}/out/install/${presetName}},vendor: { microsoft.com/VisualStudioSettings/CMake/1.0: { hostOS: [ Windows ] } }},{name: RelWithDebInfo,displayName: Windows x64 RelWithDebInfo Shared Library,description: 面向具有 Visual Studio 开发环境的 Windows。,generator: Ninja,binaryDir: ${sourceDir}/out/build/${presetName},architecture: {value: x64,strategy: external},cacheVariables: {CMAKE_BUILD_TYPE: RelWithDebInfo,CMAKE_INSTALL_PREFIX: ${sourceDir}/out/install/${presetName}},vendor: { microsoft.com/VisualStudioSettings/CMake/1.0: { hostOS: [ Windows ] } }}]
}请务必注意我们这里使用的是CMake比较推荐和比较新的目标链接机制来引入libzip库关于这一点请务必复习上一篇博文的内容。这里要说的是如果find_package(libzip REQUIRED)失败那么可能需要指定依赖库的安装目录具体是在CMakePresets.json文件中的RelWithDebInfo配置中增加CMAKE_PREFIX_PATH笔者这里使用的GISBasic环境变量指向的目录。至于libzip如何构建安装可以参考本系列之前的博文。
{name: RelWithDebInfo,displayName: Windows x64 RelWithDebInfo Shared Library,description: 面向具有 Visual Studio 开发环境的 Windows。,generator: Ninja,binaryDir: ${sourceDir}/out/build/${presetName},architecture: {value: x64,strategy: external},cacheVariables: {CMAKE_BUILD_TYPE: RelWithDebInfo,CMAKE_PREFIX_PATH: $env{GISBasic},CMAKE_INSTALL_PREFIX: ${sourceDir}/out/install/${presetName}},vendor: {microsoft.com/VisualStudioSettings/CMake/1.0: {hostOS: [Windows]}}
}4. 总结
好了使用Visual Studio 2019进行CMake项目的开发的步骤和注意事项就是以上内容了。其实笔者也很想使用Visual Studio 2022甚至更新的版本来进行CMake项目的开发不过受限于工作的环境没有进行升级。如果有试用的读者欢迎进行留言看看与Visual Studio 2019对比有哪些区别或者提升。