欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于Cmake+QT+VS的C++项目构建开发编译简明教程

程序员文章站 2022-06-22 09:07:14
基于Cmake、QT Creator、Visual Studio的C++项目构建、开发、编译是初学者必要的工具,本文主要介绍这些工具的下载与安装,以及C++及Qt项目构建,主要包括 1.基于VS构建Qt项目;2.基于Qt Creater构建,在VS中开发Qt Creater生成的项目;3.基于Cma... ......

目录

一、工具下载与安装

1.     qt

2.     visual studio 2015

3.     cmake

二、c++及qt项目构建

1.     基于vs构建qt项目

2.     基于qt creater构建,在vs中使用

用qt creater构建项目

用vs开发qt creater生成的项目

3.     基于cmake构建

用cmake-gui构建

用批处理方式进行cmake构建项目

 ===========================================

简介

目前项目是尽量利用开源项目为基础,考虑到跨平台,以及后期便于开发的协同和延续,开发语言基于c/c++、ui基于qt(5.7.1),集成开发环境(ide)使用visual studio(2015),开发阶段基于windows(win10)操作系统(32位 or 64位,如果内存大于4g,建议选64位),项目构建工具使用cmake。

一、工具下载与安装

1.  qt

  • 下载
    • 当前版本:
    • 所有版本:
    • 官方发布版本:

基于Cmake+QT+VS的C++项目构建开发编译简明教程

  • 安装
    • 步骤省略(建议使用默认安装即可,包括路径应该在c盘,安装路径不要包含中文)
  • 配置
    • 在系统路径中添加qt bin路径(如“;c:\qt\5.7.1\5.7\msvc2015\bin”),

基于Cmake+QT+VS的C++项目构建开发编译简明教程

2. visual studio 2015

  • 下载
    • visual studio ide、代码编辑器、vsts 和应用中心:

    https://visualstudio.microsoft.com/zh-hans/

    • 下载 | ide、code 和 team foundation server:

    https://visualstudio.microsoft.com/zh-hans/downloads/

    • 下载旧版 visual studio 软件:

 https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/

  • 安装
    • 步骤省略(建议使用默认安装即可,包括路径应该在c盘;同时,需要将与windows c/c++开发有关的tools、sdk都选中,否则,后续用cmake生成vs工程时,可能出现错误)
  • 配置
    • 打开vs,选择【工具】-【扩展和更新】,搜索“qt”,在结果中选择“qt visual studio tools”,下载安装后,在vs菜单中增加了【qt vs tools】。然后选择【qt vs tools】-> 【qt option】,添加qt版本,名称“qt5.7.1”,路径“c:\qt\5.7.1\5.7\msvc2015\”。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

3. cmake

  • 简介
    • cmake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的c++特性,类似unix下的automake。只是 cmake 的组态档取名为 cmakelists.txt。cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 unix 的 makefile 或 windows visual c++ 的 projects / workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(ide)的开发者可以用标准的方式建构自己的软件。cmake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。cmake 也支持静态与动态程式库的建构。“cmake”这个名字是“cross platform make”的缩写。虽然名字中含有“make”,但是cmake和unix上常见的“make”系统是分开的,而且更为高阶。作为跨平台构建工具,cmake的创建是为了响应由nlm资助的insight segmentation and registration toolkit(itk)的强大的跨平台构建环境,作为visible human project的一部分。它受到ken martin和其他开发人员创建的早期系统pcmaker的影响,以支持visualization toolkit(vtk)开源3d图形和可视化系统。最初的cmake实施是在2000年中期,加速开发发生在2001年初。许多改进是由于其他开发人员将cmake纳入他们自己的系统的影响。例如, brad king添加了一些功能以支持cable,自动包装环境和gcc-xml,以及ge corporate r&d需要对其测试基础架构(dart)的支持。添加了其他功能以支持vtk的构建环境向cmake的过渡,并支持paraview,一个并行可视化系统,以支持洛斯阿拉莫斯国家实验室的高级计算实验室。
    • cmake官方文档cmake tutorial:;
    • 下载windows win64-x64 installer
    • 地址:;
  • 安装
    • 步骤省略(建议使用默认安装即可,包括路径应该在c盘)
  • 配置
    • 将cmake安装路径及bin路径“c:\cmake3;c:\cmake3\bin”添加到系统path中;
    • 并在系统变量中增加变量名:“cmake_prefix_path”,变量值:“c:\qt\5.7.1\5.7\msvc2015”。

二、c++及qt项目构建

1. 基于vs构建qt项目

  • 打开vs,新建项目,在模板中选择“qt”,选择“qt gui application”,项目名称“qtguidemo”,解决方案同名,设置项目路径(建议新建,不使用中文命名的文件夹),确定。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

  • 根据向导,选择新项目需要加载的qt模块,其中core、gui、widgets为默认加载,下一步。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

  • 选择生成项目的基类“qmainwindow”,其他需自动生成的文件均用默认名称,finish。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

  • 生成解决方案,自动生成了相关源文件,main.cpp、qtguidemo.h、qtguidemo.cpp、qtguidemo.qrc、qtguidemo.ui,在解决方案窗口可见项目文件结构。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

  •  在项目目录中生成的文件结构:

基于Cmake+QT+VS的C++项目构建开发编译简明教程

  • main.cpp
#include "qtguidemo.h"
#include <qtwidgets/qapplication>
 
int main(int argc, char *argv[])
{
  qapplication a(argc, argv);
  qtguidemo w;
  w.show();
  return a.exec();
}
  •  qtguidemo.h
#pragma once
 
#include <qtwidgets/qmainwindow>
#include "ui_qtguidemo.h"
 
class qtguidemo : public qmainwindow
{
  q_object
 
public:

qtguidemo(qwidget *parent = q_nullptr);
private:

ui::qtguidemoclass ui;
};
  • qtguidemo.cpp
#include "qtguidemo.h"
 
qtguidemo::qtguidemo(qwidget *parent)
  : qmainwindow(parent)
{
  ui.setupui(this);
}

2.基于qt creater构建,在vs中使用

  • 用qt creater构建项目

    • 打开qt creater,新建项目。添加项目名称及路径。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

    • 选择编译套件。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

    •  指定源码文件基本信息。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

    •  生成。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

 

  • main.cpp
#include "qtguidemo.h"
#include <qapplication>
int main(int argc, char *argv[])
{
    qapplication a(argc, argv);
    qtguidemo w;
    w.show();
    return a.exec();
}
  • qtguidemo.h
#ifndef qtguidemo_h
#define qtguidemo_h
#include <qmainwindow>
namespace ui {
class qtguidemo;
}
class qtguidemo : public qmainwindow
{
    q_object
public:

explicit qtguidemo(qwidget *parent = 0);
~qtguidemo();
private:

ui::qtguidemo *ui;
}
#endif // qtguidemo_h
  • qtguidemo.cpp
#include "qtguidemo.h"
#include "ui_qtguidemo.h"
qtguidemo::qtguidemo(qwidget *parent) :
    qmainwindow(parent),
    ui(new ui::qtguidemo)
{
    ui->setupui(this);
}
qtguidemo::~qtguidemo()
{
delete ui;
}
    • 可以观察vs和qt creater生成的代码区别。

 

  • 通过vs或qt creater编译后,生成的界面。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

  • 用vs开发qt creater生成的项目

    • 打开vs,选择【qt vs tools】,选择【open qt project file(.pro)】,项目打开后即可直接修改、编译。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

3.基于cmake构建

  • 用cmake-gui构建

    • 新建目录“cmakeqtguidemo”,将用qt creater生成的qtguidemo项目中的源文件复制进来,其中包含main.cpp、qtguidemo.cpp、qtguidemo.h、qtguidemo.ui;
    • 在该目录中新建一个以“cmakelists.txt”命名的文本文件,用记事本编辑即可,其内容如下:
1.#设置cmake版本号
2.cmake_minimum_required(version 3.4.0)
3. 
4.#设置工程名称
5.project(qtguidemo)
6. 
7.#设置工程包含当前目录,非必须
8.set(cmake_include_current_dir on)
9. 
10.#打开全局moc,设置自动生成moc文件,一定要设置
11.set(cmake_automoc on)
12.#打开全局uic,非必须
13.set(cmake_autouic on)
14.#打开全局rcc,非必须,如需打开,注意修改33行的qrc文件名
15.#set(cmake_autorcc on)
16.
17.#查找需要的qt库文件,最好每一个库都要写,qt也会根据依赖关系自动添加
18.find_package(qt5widgets) 
19.find_package(qt5core)
20.find_package(qt5gui)
21.
22.#查找当前文件夹中的所有源代码文件,也可以通过set命令将所有文件设置为一个变量
23.file(glob src_files "./*.cpp")
24.#查找设置当前文件夹中所有的头文件
25.file(glob head_files "./*.h")
26.#查找设置当前文件夹中所有的ui文件
27.file(glob ui_files "./*.ui")
28.
29.#通过ui文件生成对应的头文件,一定要添加
30.qt5_wrap_ui(wrap_files ${ui_files})
31.
32.#添加资源文件,非必须,一旦采用,注意修改相应的qrc文件名
33.#set(rcc_files rcc.qrc)
34.
35.#将ui文件和生成文件整理在一个文件夹中,非必须
36.source_group("ui" files ${ui_files} ${wrap_files} )
37.
38.#创建工程文件
39.add_executable(${project_name} ${src_files} ${head_files} ${rcc_files} ${wrap_files})
40.
41.#添加qt5依赖项
42.target_link_libraries(${project_name} qt5::widgets qt5::core qt5::gui)
    • 运行cmake-gui,在“where is the source code”和"where to build the binaries"中均输入本地项目目录“c:\qttest\cmakeqtguidemo”,可选择内部编译,即在同一目录中生成项目,目的在于后期在引用lib中的头文件或库文件时不需另外操作,不好的地方就是源文件和目标文件混杂,如果想要在源文件外部编译,可在"where to build the binaries"中输入目标路径“c:\qttest\cmakeqtguidemo_build”,后期再将源文件中头文件和库文件拷贝至目标文件夹对应的lib中。(个人项目建议选外部编译);

基于Cmake+QT+VS的C++项目构建开发编译简明教程

    • 勾选"grouped"和"advanced",便于列表项汇总扩展显示;点击"configure"按钮,弹出生成环境选项,在此根据目标选择64位还是32位编译,此例中选择"visual studio 14 2015",并选中"use default native compilers"用缺省编译器,点击"finish"按钮,进行安装配置

基于Cmake+QT+VS的C++项目构建开发编译简明教程

    • 经过短暂的等待,有可能会在窗口中出现若干红色选项,再次点击"configure"按钮继续生成,如还有红色选项出现,不需其他操作,继续"configure",直到无红色选项,点"generate"按钮,生成vs2015的解决方案等文件,提示"generating done";

基于Cmake+QT+VS的C++项目构建开发编译简明教程

    • 用vs2015打开该解决方案即可进行继续开发了。因为是目录外构建,源文件并不在此目录中,但在vs中可以直接打开源文件进行编辑和保存。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

  • 用批处理方式进行cmake构建项目

    在项目开发初期,会因为各种配置或代码问题,需要经常进行cmake,每次都用cmake-gui执行会比较麻烦,在此,可以利用批处理方式执行cmake项目构建。以cmakeqtguidemo项目为例。

基于Cmake+QT+VS的C++项目构建开发编译简明教程

    • 在此项目源文件目录下,新建cmake_build_vs2015_project.bat文本文件(该文件要求必须在项目源文件目录下,即与项目cmakelists.txt文件同目录下),其内容如下(rem为注释):
@echo off

rem 获取项目cmakelists.txt文件所在目录
set current_cmake_dir=%~dp0

rem 获取项目cmakelists.txt文件所在目录的名称,用于新建构建目录
for /f "delims=" %%i in ("%cd%") do set current_dir_name=%%~ni

rem 到项目cmakelists.txt文件所在目录的上级目录
cd..

rem 获取当前目录,%cd%与%~dp0的区别在于获取的目录尾部少了“\”
set current_dir=%cd%

rem 设置需要外部构建的目录名称,在源文件目录后面加“_build”
set project_name=%current_dir_name%_build

rem 设置外部构建的完整路径
set current_new_dir=%current_dir%\%project_name%
echo cmake in [%current_new_dir%]

rem 判断是否已经存在外部构建的路径,如果存在删除
if exist %current_new_dir% (
    rd /s/q %current_new_dir%
)

rem 新建外部构建目录
mkdir %current_new_dir%

rem 进入新建的外部构建目录,用于cmake生成项目文档
cd %current_new_dir%

rem 根据编译环境需要设定vs版本,%current_cmake_dir%用于指定cmakelists.txt所在目录,-g 用于指定makefile的生成工具
::cmake ../ -g "visual studio 14 2015 win64"
::cmake ../ -g "visual studio 14 2015 arm"
cmake %current_cmake_dir% -g "visual studio 14 2015"

cd..

rem 查看构建项目的目录树
tree %current_new_dir% /f

pause
    • 运行cmd(或vs开发人员命令提示窗口),进入命令提示符窗口,定位到cmake_build_vs2015_project.bat所在目录,并执行。
    • 用批处理方式生成的项目与用cmake-gui生成的项目是一样的,用vs2015打开该解决方案即可进行继续开发了。
    • 为什么需要cmake构建项目,主要是在实际项目中,经常会用到多个第三方库,或复杂项目结构,用qt creater(qmake)或vs构建,过程会变得很繁琐,一旦设置有误,就会出现很多编译错误,特别是用vs加载第三方库,因此,对简单的qt工程,采用 qmake或vs,对复杂度高的或需加载多个第三方库的,采用cmake。
    • 本示例仅描述了简单的cmake构建项目内容,更复杂的cmakelists.txt文档,需要在实践中不断总结完善,以形成项目需要的模板(可复用原则)。
  • 练习:在qt目录下找到examples目录,然后在widgets目录中找到mainwindows\mdi项目,对其进行多种构建尝试,并可以学习和掌握关于qmainwindow类及gui开发的用法,同时,可以配合qt助手进行进一步详细学习各种类的用法。

基于Cmake+QT+VS的C++项目构建开发编译简明教程