Clion+Cmake+Qt5+Qwt+msys2+MinGW在Windows下的安装配置使用教程

摘要:

CLion, a cross-platform C/C++ IDE. 本文主要介绍基于Clion作为IDE, MinGW作为编译器,CMake作为项目构建工具,开发基于Qt5、qwt的C++图形GUI项目的安装、配置、编译过程。

KeyWords:Clion;Cmake;Qt5;Qwt;msys2;MinGW;Windows

目录:

  1. 软件安装
  2. 环境配置
  3. 开发示例
  4. 注意事项
  5. pacman基本命令参数

教程:

1. 软件安装

  • Jetbrains CLion
  • Cmake(可选)
    • 除非必要,一般不必另安装,可以使用Clion中自带的Cmake。如一定要选用个人安装的,请注意在工具链中的Cmake路径设置,否则可以直接选bundled即可。
  • Qt5 for MinGW64 use msys2
  • msys2:下载安装msys2,在MinGW-64下载页面(url: http://mingw-w64.org/doku.php/download ),进入msys2页面进行下载,也可直接从http://www.msys2.org进入下载( 32位:msys2-i686-20180531.exe;64位:msys2-x86_64-20180531.exe),建议安装在磁盘空间大的磁盘目录下,因为安装Qt及依赖软件需要占用很多存储空间,本例中安装在C:\msys64目录下,并将此目录和bin目录加入系统路径中。
    • Pacman:msys2 移植了Arch Linux 上的软件包管理系统 Pacman,有了包管理系统,升级、安装新的软件就很简单了(pacman常用命令参数见文末说明)。在此管理系统中,软件包的命名中前缀为“mingw-w64-”,然后是针对命名32位或64位系统使用, "-x86_64-" for 64-bit, "-i686-" for 32-bit。下载的软件包也会据此安装部署到不同的目录中,如32位的软件会部署到C:\msys64\mingw32中,64位的会部署到C:\msys64\mingw64中。软件下载包是放在C:\msys64\var\cache\pacman\pkg中。
  • Qt5:msys2提供编译好的MinGW-w64套件,一般提供了32位和64位两个版本。Qt也分别有编译好的32位和64位版本,以及静态链接和动态链接共4个版本,以及QtCreator。(mingw-w64-i686-qt5,mingw-w64-i686-qt5-static,mingw-w64-i686-qt-creator;mingw-w64-x86_64-qt5,mingw-w64-x86_64-qt5-stati, mingw-w64-x86_64-qt-creator)。
    • 启动msys2的命令行窗口,通过pacman下载安装MinGW版本的Qt5。在此已32位的为例。
    • pacman -S mingw-w64-i686-qt5 mingw-w64-i686-qt5-static
    • 下载安装make和gdb工具;
    • pacman -S mingw-w64-i686-make mingw-w64-i686-gdb
    • 安装完成后,在系统路径中添加bin路径;
    • C:\msys64;C:\msys64\mingw32\bin
    • 至此,即可正常使用Qt5了。可以用Qt5自带的示例测试是否安装正常,用CLion编译过程附后。
  • 第三方库安装(以QWT为例)
    • QWT:全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目, 可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出方式可以是Curves(曲线),Slider(滚动条),Dials(圆盘),Compasses(仪表盘)等等。该工具库基于Qt开发,所以也继承了Qt的跨平台特性。在msys2中针对MinGW-w64提供了两个版本(mingw-w64-i686-qwt-qt5 mingw-w64-x86_64-qwt-qt5)。本文以32位为例,进行下载安装。因为第三方库的路径都是基于msys2的,所以无需后续系统路径的配置。
    • pacman -S mingw-w64-i686-qwt-qt5
    • 至此,如果需要用Clion作为IDE,用MinGW作为编译器,用CMake作为项目构建工具,开发基于Qt5、qwt的C++图形GUI项目,就已经基本具备条件了。
  • 其他可选的编译器或Qt版本
    • 基于MinGW的Qt5官方安装包模式:此模式下,需用其自带的MinGW,如使用qwt,需对qwt源码进行此版本下的编译生成,方可使用。
      • 下载地址: http://download.qt.io/archive/qt/5.7/5.7.1/qt-opensource-windows-x86-mingw530-5.7.1.exe
      • 安装需要注意,选择Tools里面的MinGW5.3.0,安装的Qt for MinGW的Tools中含有gcc/g++,是用来编译此版本Qt项目的。在CLion中,如图设置Toolchains:

                       

    • LLVM Clang for MinGW64 (可选)
      • Step 1: Install the msys2.
      • Step 2: Launch the msys terminal and install llvm/clang.
      • pacman -S mingw-w64-i686-llvm mingw-w64-i686-clang mingw-w64-i686-make mingw-w64-i686-gdb
      • Step 3: Let CMake detect clang from the environment variables.
      • CLion Setting Toolchains

 

      • CLion Setting CMake

 

      • Step 4: Rebuild the project workspace.
      • Tools -> CMake -> Reset Cache and Reload Project
"C:\Program Files\JetBrains\CLion 2019.1\bin\cmake\win\bin\cmake.exe" -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=C:/msys64/mingw32/bin/mingw32-make.exe -DCMAKE_C_COMPILER=C:/msys64/mingw32/bin/clang.exe -DCMAKE_CXX_COMPILER=C:/msys64/mingw32/bin/clang++.exe -G "CodeBlocks - MinGW Makefiles" C:\CLionProjects\DynamicLayouts
-- The C compiler identification is Clang 5.0.1
-- The CXX compiler identification is Clang 5.0.1
-- Check for working C compiler: C:/msys64/mingw32/bin/clang.exe
-- Check for working C compiler: C:/msys64/mingw32/bin/clang.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/msys64/mingw32/bin/clang++.exe
-- Check for working CXX compiler: C:/msys64/mingw32/bin/clang++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/CLionProjects/DynamicLayouts/cmake-build-release-msys-clang

[Finished]

然而,这种方法编译Qt项目,生成的项目执行文件比用QtTool的MinGW编译的大!

2. CLion开发Qt5环境配置

  • CLion Setting Toolchains

 

  • CLion Setting CMake(除选择Build Type和Toolchain外,其他都是默认项)

 

  • 一般在做了工具链修改或项目CMakeLists.txt文件的修改,需要重新构建项目,再进行项目编译调试。通过在CLion中,选择Tools -> CMake -> Reset Cache and Reload Project

 

3. 开发示例

  • Qt5 for msys2 MinGW32
  • CMakeLists.txt for qt5 project,在CLion中,可用MinGW32、MinGW for Qt Tool、Clang编译工具链均可。
cmake_minimum_required(VERSION 3.7)
project(DynamicLayouts)
# 指定c++标准的版本
set(CMAKE_CXX_STANDARD 14)

# 设置Qt5的cmake模块所在目录,如果不设置将使用系统提供的版本
# QT_DIR和QT_VERSION是指定了qt安装目录和版本的环境变量
# set(CMAKE_PREFIX_PATH $ENV{QT_DIR}/$ENV{QT_VERSION}/mingw53_32/lib/cmake)
set(CMAKE_PREFIX_PATH "C:\\Qt\\Qt5.7.1\\5.7\\mingw53_32\\lib\\cmake")

#设置工程包含当前目录,非必须
set(CMAKE_INCLUDE_CURRENT_DIR ON)

#打开全局moc,设置自动生成moc文件,一定要设置
set(CMAKE_AUTOMOC ON)
#打开全局uic,非必须
set(CMAKE_AUTOUIC ON)
#打开全局rcc,非必须,如需打开,注意修改33行的qrc文件名
set(CMAKE_AUTORCC ON)

# Add compiler flags for building executables (-fPIE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")

#设置运行时输出可执行文件目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
#设置运行时输出共享库文件目录
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/lib)

#查找需要的Qt库文件,最好每一个库都要写,Qt也会根据依赖关系自动添加
set(Projects_QT5_COMPONENTS 
Core 
Gui 
Widgets
)

set(Projects_QT5_Includes
${Qt5Core_INCLUDE}
${Qt5Gui_INCLUDE}
${Qt5Widgets_INCLUDE}
)

set(Projects_QT5_Libraries
Qt5::Core
Qt5::Gui
Qt5::Widgets
)

find_package(Qt5 COMPONENTS ${Projects_QT5_COMPONENTS} REQUIRED)

INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_SOURCE_DIR}
${Projects_QT5_Includes}
)#设置项目包含目录

#查找当前文件夹中的所有源代码文件,也可以通过Set命令将所有文件设置为一个变量
FILE(GLOB SRC_FILES "./*.cpp")
#查找设置当前文件夹中所有的头文件
FILE(GLOB HEAD_FILES "./*.h")
#查找设置当前文件夹中所有的ui文件
FILE(GLOB UI_FILES "./*.ui")

#通过Ui文件生成对应的头文件,一定要添加
# qt5_wrap_ui(WRAP_FILES ${UI_FILES})

#添加资源文件,非必须,一旦采用,注意修改相应的qrc文件名
# set(RCC_FILES rcc.qrc)

#将ui文件和生成文件整理在一个文件夹中,非必须
# source_group("Ui" FILES ${UI_FILES} ${WRAP_FILES} )

#创建工程文件
# add_executable(${PROJECT_NAME} ${SRC_FILES} ${HEAD_FILES} ${RCC_FILES} ${WRAP_FILES})
add_executable(${PROJECT_NAME}
${SRC_FILES}
${HEAD_FILES}
)

#添加Qt5依赖项
target_link_libraries(${PROJECT_NAME}
${Projects_QT5_Libraries}
)
  • CMakeLists.txt for qt5-qwt Projects,在CLion中,用msys2的MinGW32编译工具链。
cmake_minimum_required(VERSION 3.7)
project(QwtRadio)
# 指定c++标准的版本
set(CMAKE_CXX_STANDARD 14)

# 设置Qt5的cmake模块所在目录,如果不设置将使用系统提供的版本C:\Qt\Qt5.7.1\5.7\mingw53_32\lib\cmake
# QT_DIR和QT_VERSION是指定了qt安装目录和版本的环境变量C:\msys64\mingw32\lib\cmake
set(CMAKE_PREFIX_PATH "C:\\msys64\\mingw32\\lib\\cmake")

#设置工程包含当前目录,非必须
set(CMAKE_INCLUDE_CURRENT_DIR ON)

#打开全局moc,设置自动生成moc文件,一定要设置
set(CMAKE_AUTOMOC ON)
#打开全局uic,非必须
set(CMAKE_AUTOUIC ON)
#打开全局rcc,非必须,如需打开,注意修改33行的qrc文件名
set(CMAKE_AUTORCC ON)

# Add compiler flags for building executables (-fPIE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")

#设置运行时输出可执行文件目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
#设置运行时输出共享库文件目录
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/lib)

#查找需要的Qt库文件,最好每一个库都要写,Qt也会根据依赖关系自动添加
MESSAGE("======Searching for Qt5======")
set(Projects_QT5_COMPONENTS
Core
Gui
Widgets
)
set(Projects_QT5_Includes
${Qt5Core_INCLUDE_DIRS}
${Qt5Gui_INCLUDE_DIRS}
${Qt5Widgets_INCLUDE_DIRS}
)
set(Projects_QT5_Libraries
Qt5::Core
Qt5::Gui
Qt5::Widgets
)
find_package(Qt5 COMPONENTS ${Projects_QT5_COMPONENTS} REQUIRED)
MESSAGE(${Qt5Widgets_INCLUDE_DIRS})
MESSAGE(${Projects_QT5_Libraries})

MESSAGE("=======Searching for QWT======")
FIND_PATH(QWT_INCLUDE_DIR NAMES qwt.h PATHS
${QT_INCLUDE_DIR}
PATH_SUFFIXES qwt
)
MESSAGE(${QWT_INCLUDE_DIR})
FIND_LIBRARY(QWT_LIBRARY NAMES qwt PATHS
${QT_INCLUDE_DIR}/lib
)
MESSAGE(${QWT_LIBRARY})

#设置项目包含目录,包括将第三方库附加
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_SOURCE_DIR}
${Projects_QT5_Includes}
${QWT_INCLUDE_DIR}
)
# 将第三方库附加到变量Projects_Extra_Libraries中,便于管理
list(APPEND Projects_Extra_Libraries ${QWT_LIBRARY})
# 等价于VS下 属性-<配置属性-<C/C++-<预处理器,预处理器定义:QWT_DLL LOG4QT_DLL
ADD_DEFINITIONS(-DQWT_DLL)

#查找当前文件夹中的所有源代码文件,也可以通过Set命令将所有文件设置为一个变量
FILE(GLOB SRC_FILES "./*.cpp")
#查找设置当前文件夹中所有的头文件
FILE(GLOB HEAD_FILES "./*.h")
#查找设置当前文件夹中所有的ui文件
FILE(GLOB UI_FILES "./*.ui")

#通过Ui文件生成对应的头文件,一定要添加
# qt5_wrap_ui(WRAP_FILES ${UI_FILES})

#添加资源文件,非必须,一旦采用,注意修改相应的qrc文件名
# set(RCC_FILES rcc.qrc)

#将ui文件和生成文件整理在一个文件夹中,非必须
# source_group("Ui" FILES ${UI_FILES} ${WRAP_FILES} )

#创建工程文件
# add_executable(${PROJECT_NAME} ${SRC_FILES} ${HEAD_FILES} ${RCC_FILES} ${WRAP_FILES})
add_executable(${PROJECT_NAME}
${SRC_FILES}
${HEAD_FILES}
# ${RCC_FILES}
)

#添加Qt5依赖项,添加qwt等第三方依赖项
target_link_libraries(${PROJECT_NAME}
${Projects_QT5_Libraries}
${Projects_Extra_Libraries}
)
  • CMake输出信息:
"C:\Program Files\JetBrains\CLion 2019.1\bin\cmake\win\bin\cmake.exe" -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=C:/msys64/mingw32/bin/mingw32-make.exe -DCMAKE_C_COMPILER=C:/msys64/mingw32/bin/gcc.exe -DCMAKE_CXX_COMPILER=C:/msys64/mingw32/bin/g++.exe -G "CodeBlocks - MinGW Makefiles" C:\CLionProjects\QwtRadio
-- The C compiler identification is GNU 7.3.0
-- The CXX compiler identification is GNU 7.3.0
-- Check for working C compiler: C:/msys64/mingw32/bin/gcc.exe
-- Check for working C compiler: C:/msys64/mingw32/bin/gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/msys64/mingw32/bin/g++.exe
-- Check for working CXX compiler: C:/msys64/mingw32/bin/g++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
======Searching for Qt5======
C:/msys64/mingw32/include/C:/msys64/mingw32/include/QtWidgetsC:/msys64/mingw32/include/QtGuiC:/msys64/mingw32/include/QtCoreC:/msys64/mingw32/share/qt5//mkspecs/win32-g++
Qt5::CoreQt5::GuiQt5::Widgets
=======Searching for QWT======
C:/msys64/mingw32/include/qwt
C:/msys64/mingw32/lib/libqwt.dll.a
-- Configuring done
-- Generating done
-- Build files have been written to: C:/CLionProjects/QwtRadio/cmake-build-release-mingw32msys

[Finished]
  • 示例用QWT自带的示例Radio(可从https://sourceforge.net/projects/qwt/files/qwt/下载的压缩包中获得),在项目中去掉.pro文件,然后添加相应针对qwt的CMakeLists.txt文件,在CLion中,用基于msys2的工具链进行编译调试,顺利成功!

 

注意事项

  • 在测试过程中发现,一定要注意非自编译的库,如Qt、Qwt等,都是从官方或msys中获得,必须要保证其已编译的库所使用的工具环境一致性,不同工具环境编译的库是不能互相调用的。如需要使用msys中的qwt库,就一定要用其对应的Qt库(同样从msys中获得的),因为都是用msys中的MinGW生成的,所以在使用时不会有问题;如果用Qt官方的MinGW版本的Qt进行使用,则不能成功,即使编译通过,会输出:Process finished with exit code -1073741511 (0xC0000139),打开执行文件会提示无法定位程序入口的弹窗,如必须使用此版本Qt,那需要通过qwt源码,用此Qt版本工具中的MinGW重新编译生成qwt库,再行使用方可。同时,这也体现在CLion的Toolchains设置中,各项也都应保持一致。 

 


 

附:pacman基本命令参数

更新本地软件包:
pacman -S --refresh
可以缩写为:pacman -Sy

升级软件包:
pacman -S --refresh --sysupgrade 
可以缩写为:pacman -Syu

列出所有已安装软件包:
pacman -Q --explicit
或者
pacman -Q -e
可以列出所有的软件组:
pacman -Q --groups

安装新的软件包:
pacman -S <package_names|package_groups>
比如安装 Qt5:
pacman -S mingw-w64-i686-qt5 
注:可以不用明确软件包版本,系统会根据依赖项进行自动匹配下载相应版本。

搜索软件包:
如果不清楚软件的准确名称,可以通过核心软件名查询软件包的名称。
pacman -Ss <name_pattern>
比如搜索gcc相关的软件
pacman -Ss gcc

删除软件包:
pacman -R <package_names|package_groups>

猜你喜欢

转载自www.cnblogs.com/JoyPoint/p/10662138.html