从零开始记录Qt Creator构建cmake项目



  • 大家好哦,有很久没有写简单的教程了,虽然我们目前做的项目主要以qmake居多,但是不容忽视的是,cmake逐渐成为另一股C++主流构建方法,很多大型的IDE都内置了cmake的支持。这不,Qt Creator也能够支持cmake的构建了。好在我们非常熟悉Qt Creator的使用,这里向大家简单介绍一下cmake项目是如何一点一点构建的。

    从零开始

    这的确是从零开始哦。首先大家创建一个项目,选择的项目名称是普通的C++应用程序,如下图:
    0_1522059880118_2018-03-26-182406_882x556_scrot.png
    然后点击下一步:
    0_1522059905397_2018-03-26-182457_802x536_scrot.png
    这里注意了,要选择CMake而不是QMake。
    0_1522059957018_2018-03-26-182552_802x536_scrot.png
    然后选择大家熟悉的构建套件,这里其实没有太大的关系,因为第一个应用完全不用上Qt哈:
    0_1522059986828_2018-03-26-182621_802x536_scrot.png

    最后点击完成,即可。
    最后生成的文件可以说也是非常简单:CMakeLists.txt文件和main.cpp文件。

    大家肯定会好奇去双击看看CMakeLists.txt内容长什么样的,大概是这样的:

    # 规定了cmake的最小支持版本
    cmake_minimum_required(VERSION 2.8)
    
    # 规定了项目的名称
    project(cmake_tutorial_0)
    
    # 规定了项目的源文件名称
    add_executable(${PROJECT_NAME} "main.cpp")
    
    

    add_executable的文档在这里
    其实也算是非常简单的一个项目文件了。唯一需要注意的是${PROJECT_NAME}在CMake解析的时候会被替换成project()方法中设定的名称。详见这里

    好了,点击Qt Creator左下角的三角形,开始运行你的第一个cmake项目吧。

    正在启动 /media/jiangcaiyang/Develop_g/QtProject/build-cmake_tutorial_0-Desktop_Qt_5_10_0_GCC_64bit-Default/cmake_tutorial_0...
    Hello World!
    /media/jiangcaiyang/Develop_g/QtProject/build-cmake_tutorial_0-Desktop_Qt_5_10_0_GCC_64bit-Default/cmake_tutorial_0 退出,代码 0
    

    一个简单的HelloWorld程序就产生了!



  • 使用CMake编译Qt项目是从哪个版本开始提供的?而且使用cmake编译,我感觉实际上不需要官方的帮助,之前就见过有人用cmake编译qt项目。当然,官方支持更好。

    不过头大,qmake还没完全熟悉呢,又要学习cmake。



  • @stlcours CMake主要给那些长期使用CMake项目提供一个界面友好的IDE。其实用CMake-GUI也可以达到效果。此外,CMake的脚本解析方式和qmake也是差不多的,很多概念CMake和qmake是共通的。



  • 使用CMake在 Qt creator 下构建项目有一些不太方便的地方,比如不能像qmake那样直接在项目里添加文件,我16年的项目就全是CMake建构的,那时候也是使用 Qt Creator 作为IDE,不知道现在新版的 Qt Creator 对CMake 的支持好一点了没有



  • @药师 这个我想应该没有什么问题。Qt Creator现在打算支持三种构建方式:qmake、cmake和qbs。



  • @jiangcaiyang 嗯,qbs的话,前段时间编一些开源库的时候用了,但是感觉。。。怎么说,可能是我接受不了新东西?不是那么方便。



  • @药师 作为一个试点,qbs支持构建Qt Creator应用。还有一个网友@qyvlik 也多多尝试了qbs应用,这个新的方式什么时候能够被“扶正”,还是要看时间的推移。



  • cmake构建Qt么?
    我可以分享一个我的使用方法




Log in to reply
 

走马观花

最近的回复

  • C

    Qt for MCU需要商业授权的

    read more
  • Qt for MCUs

    搭建Qt for MCUs PC端开发环境。qt for mcus提供了一个完整的图形框架和工具包,包含了在MCUs上设计、开发和部署gui所需的一切。它允许您在裸机或实时操作系统上运行应用程序。

    先决条件

    开发主机环境支持仅限于Windows 10

    MSVC compiler v19.16 (Visual Studio 2017 15.9.9 or newer) x64

    CMake v3.13 or newer (you can install it using the Qt Online installer) x64

    使用Qt联机安装程序安装Qt for MCUs,该安装程序可通过Qt帐户下载

    安装Qt 5.14和Qt Creator 4.11 or higher

    安装链接

    › Qt: https://account.qt.io/downloads
    › CMake: https://cmake.org/download/
    › Python 2.7 32-bit: https://www.python.org/downloads/release/python-2716/
    › Arm GCC: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnutoolchain/gnu-rm/downloads
    › J-Link Software Pack: https://www.segger.com/downloads/jlink/JLink_Windows.exe
    › J-Link OpenSDA Firmware: https://www.segger.com/downloads/jlink/OpenSDA_MIMXRT1050-EVKHyperflash
    › STM32CubeProgrammer: https://www.st.com/en/development-tools/stm32cubeprog.html
    › STM32 ST-LINK Utility: https://www.st.com/en/development-tools/stsw-link004.html​​​​​​​

    Qt Creator设置 启用Qt Creator插件 选择“帮助>关于插件”,然后从列表中选择“MCU支持(实验性)”插件,重新启动Qt Creator以应用更改
    替代文字 为MCU创建Qt工具包

    选择工具>选项>设备>MCU

    选择Qt for MCUs-Desktop 32bpp作为目标

    如果尚未设置,请提供Qt for MCUs安装目录的路径。

    单击Apply应用。

    替代文字

    替代文字
    替代文字

    注意:

    编译器要选X64,Qt版本要选64bit,CMake Tool选x64

    打开恒温器项目demo

    选择文件>打开文件或项目。。。

    打开CMakefiles.txt文件来自thermo文件夹的文件。

    选择Qt作为MCU-桌面32bpp套件。

    单击“配置项目”以完成。

    替代文字

    问题

    开发主机环境支持仅限于Windows 10

    C++编译失败,文本大字体.pixelSize.

    文本类型无法正确呈现需要复杂文本布局的unicode序列。对复杂文本使用StaticText

    read more
  • H

    hi 有问题请教你,方便加个联系方式吗

    read more
  • boost.asio是一个很棒的网络库,这回儿我也开始系统地学习起来了。想想当年接触boost,也有八年多了。这次开始接触boost,觉得既熟悉又陌生。熟悉的是小写字母+下划线的命名方式、晦涩的模板、很慢的编译速度以及较大的程序体积,陌生的是asio的各种概念:io服务、接收器、套接字等等:我之前对网络编程不是非常了解。

    于是根据我的理解,参考《Boost.Asio C++网络编程》实现了这样一个简单的客户端和服务端通信的例子,例子非常简单,还不完善,但是幸运的是,可以在本机上互通了。
    下面是客户端的代码:

    #include <iostream> #include <boost/asio.hpp> #include <boost/proto/detail/ignore_unused.hpp> using namespace std; using namespace boost::asio; using namespace boost::system; using namespace boost::proto::detail;// 提供ignore_unused方法 void writeHandler( const boost::system::error_code& ec, size_t bytesTransferred ) { if ( ec ) { cout << "Write data error, code: " << ec.value( ) << "transferred: " << bytesTransferred << endl; } else { cout << "OK! " << bytesTransferred << "bytes written. " << endl; } } int main(int argc, char *argv[]) { ignore_unused( argc ); ignore_unused( argv ); io_service service; ip::tcp::socket sock( service ); ip::tcp::endpoint ep( ip::address::from_string( "127.0.0.1" ), 6545 ); boost::system::error_code ec; sock.connect( ep, ec ); if ( ec ) { cout << "Connect error, code: " << ec.value( ) << ", We will exit." << endl; return ec.value( ); } else { char buf[1024] = "Hello world!"; sock.async_write_some( buffer( buf ), writeHandler ); sock.close( ); } return service.run( ); }

    下面是服务端的代码:

    #include <iostream> #include <boost/asio.hpp> #include <boost/proto/detail/ignore_unused.hpp> using namespace std; using namespace boost::asio; using namespace boost::system; using namespace boost::proto::detail;// 提供ignore_unused方法 void acceptHandle( const boost::system::error_code& code ) { cout << "Accepted." << endl; } int main(int argc, char *argv[]) { ignore_unused( argc ); ignore_unused( argv ); io_service service; ip::tcp::endpoint ep( ip::address::from_string( "127.0.0.1" ), 6545 ); boost::system::error_code ec; ip::tcp::socket sock( service ); ip::tcp::acceptor acceptor( service, ep ); acceptor.async_accept( sock, acceptHandle ); if ( ec ) { cout << "There is an error in server. code: " << ec.value( ) << endl; } return service.run( );// 阻塞运行 }

    运行结果是这样的:
    78448d7b-b3ae-42fc-9e2e-4dd2fbdac2c2-image.png

    我对boost.asio中几个概念的理解:

    io_service,这就是一个类似事件循环的东西,它为io设备提供服务,故名。不管是套接字、文件还是串口设备,都要使用它的服务。它的run()函数相当于启动了一个事件循环。一旦有消息了,即进行响应。这也是实现异步编程的重要基础。 socket,这个类则是套接字,可以处理TCP或者是UDP请求。有同步以及异步的处理方式,也有带异常以及不带异常的处理方式。 acceptor,接收器,仅仅是服务端使用。相当于其余框架中的listener,作接收用的。

    比较浅显,如果有不当之处,敬请指正。

    read more

关注我们

微博
QQ群