MSYS2
简介
MSYS2(Minimal SYStem 2)是一个为Windows平台开发的轻量级Linux类系统,它提供了一组GNU工具链和开发库,使得开发者可以在Windows平台上进行Linux风格的开发和编译。MSYS2基于MinGW-w64和Cygwin,它不仅可以编译和运行C/C++程序,还支持其他一些编程语言和工具,如Python、Ruby、Perl、Git等。
MSYS2提供了一个包管理器Pacman,可以方便地安装、升级和删除软件包。通过Pacman,可以安装MinGW-w64工具链、Cygwin工具链、GNU开发工具和其他开源软件。MSYS2也支持从源代码编译软件,提供了一组用于编译和构建软件的工具,如GCC、make、autoconf、cmake等。
由于MSYS2提供了一组类似于Linux的工具链和环境,使得在Windows平台上进行Linux风格的开发和编译变得更加容易和自然。因此,MSYS2被广泛地用于开源软件的开发、编译和部署。
特点
- 安装方便
- 自带 pacman 管理,可以使用 pkgtool 来 makepkg
- 较快的源速度(可以修改源地址)
- 自带软件和库较全而且比较新
- 使用mingw-w64工具链,可以编译32位或64位代码(需要自行安装)
- 中文支持好,可以直接输入和浏览中文目录
开发环境搭建
使用winget安装是最简便的方式
winget install MSYS2.MSYS2 -l D:/work/msys2_202303
打开mingw64.exe,安装toolchain、qt5 ide、qt5、boost
# msys64为最外层路径
yes | pacman -Syu
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-x86_64-qt5
pacman -S mingw-w64-x86_64-qt-creator
pacman -S --needed mingw-w64-x86_64-boost
# 以下与本文标题无关
pacman -S mingw-w64-x86_64-grpc
pacman -Sy mingw-w64-x86_64-libusb
pacman -Sy mingw-w64-x86_64-libusb-compat
在qt中使用NumCpp
使用qt ide新建qt5 console项目
# 在mingw64终端运行
# 进入qt5新建的项目目录
mkdir includes
git clone git@github.com:dpilger26/NumCpp.git
mv NumCpp/include/* ./includes
# 找到pacman安装的boost的头文件位置
# 把pacman安装的boost头文件,都拷贝到includes文件夹
cp D:\work\msys2_202303\mingw64\include\boost ./includes
修改qt5的.pro文件,增加NumCpp和boost的头文件引用
INCLUDEPATH += $$PWD/includes
#QMAKE_CXXFLAGS`选项用于定义编译器标志,即`-D_POSIX_C_SOURCE`,以启用POSIX标准函数。
QMAKE_CXXFLAGS += -D_POSIX_C_SOURCE
修改main.cpp
#这一行为弥补GCC 10不能识别_mkgmtime的缺陷
#define timegm _mkgmtime
#include <QCoreApplication>
#include "NumCpp.hpp"
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
// 简单示例
int a = 10;
// 生成2×2的int类型矩阵(NdArray)
nc::NdArray<int> a0 = { {1, 2}, {3, 4} };
// 生成3×2的int类型矩阵(NdArray)
nc::NdArray<int> a1 = { {1, 2}, {3, 4}, {5, 6} };
cout << "查看a数据类型:\n" << typeid(a).name() << endl;
cout << "查看a0数据类型:\n"<< typeid(a0).name() << endl;
cout << "a0:\n" << a0 << endl;
cout << "a1:\n" << a1 << endl;
a1.reshape(2, 3);
cout << "改变a1形状(2×3):\n" << a1 << endl;
cout << "查看a1(1,1) :\n" << a1(1,1) << endl;
auto a2 = a1.astype<double>();
cout << "int类型转换double类型:\n" << typeid(a2).name() << endl;
return app.exec();
}
gmtime_r、timegm找不到是难点
参考了以下方案 blog.csdn.net/qq_40602000…