📜  使用 C++、OpenCV 和 Gtk 的跨平台 Windows / Raspberry Pi 项目

📅  最后修改于: 2021-10-19 08:23:57             🧑  作者: Mango

介绍

本文属于关于编写、构建和调试用 C++编写的应用程序的系列文章,该应用程序使用Gtk库处理用户界面,使用OpenCV库捕获和处理来自相机的图像,兼容主要平台Mac OS XLinuxWindows ,最终运行在Raspberry Pi 上

该系列的主要文章在这里:

  • 在 Raspberry PI 上运行的 C++ 全屏 OpenCV/GtK 应用程序。

本文讨论如何配置Windows以检索源、构建和调试此类项目。该项目的来源可在此处获得:

  • https://github.com/cpp-tutorial/raspberry-cpp-gtk-opencv

安装 M2SYS

Windows没有 LinuxMac OS X那样的库的标准系统位置。因此,要获得GtkOpenCV库,您需要使用一些非标准程序,包括安装一个名为pacman的特殊包管理器和一个名为 MinGW的特殊的类似 Linux 的开发环境。

获得 pacmanMinGW的最简单方法是通过一个名为MSYS2 的开源项目。转到 MSYS2 主页并下载最适合您系统的 M2SYS安装程序(可能是 64 位,因为 i686 实际上是 32 位)。

C:\msys64文件夹中使用所有默认选项安装它。

安装后,您将拥有:

  • MSYS2 MSYS环境,您可以在其中使用pacman安装组件。
  • MSYS2 MinGW 64 位环境,代表Minimal GNU for Windows ,您可以在其中使用通过pacman安装的所有工具和库。
  • 您还可以获得MSYS2 MinGW32 ,以访问 32 位工具;如果您的系统是 64 位,则不应安装任何这些。

如下载说明中所述,首先要做的是升级包数据库。打开MSYS2 MSYS并键入以下命令:

$ pacman -Syuu

如果您遇到以下消息,请用鼠标关闭 MSYS2 MSYS窗口,再次打开它,然后运行相同的命令,直到它正常终止。

warning: terminate MSYS2 without returning to shell and check for updates again
warning: for example close your terminal window instead of calling exit

如果您正在寻找特定的包,您可以使用类似于以下的命令。假设您寻找CMake

$ pacman -Ss cmake

构建一个很棒的类似 linux 的工具包

受 Alexey Pavlov 要点的启发,我建议安装以下软件包和工具,以便您拥有一个与Linux机器中的开发环境非常相似的开发环境。有了它,您可以使用Linux工具为 Windows 编译应用程序:

$ pacman -S base base-devel net-utils git ruby wget man
$ pacman -S msys/openssh msys/vim msys/bc nano msys/tmux
$ pacman -S gzip zip unzip msys/p7zip tar msys/tree
$ pacman -S msys/winpty msys/ed msys/pwgen msys/zsh
$ pacman -S mingw64/mingw-w64-x86_64-jq
$ pacman -S msys/screenfetch
$ pacman -S mingw-w64-x86_64-toolchain
$ pacman -S mingw64/mingw-w64-x86_64-cmake

下载并安装所有这些软件包后,您可以验证它们是否存在测试一些。为此,打开MSYS2 MingGW 64 位环境,并测试一些命令:

$ git --version
$ make --version
$ cmake --version
$ gcc --version
$ pkg-config --version

也可以看看:

  • 安装 GCC 和 MYSYS2。
  • 构建一个很棒的类似 linux 的工具包。

安装 Gtk 和 OpenCV

您可以在MSYS2 MSYS 中使用 pacman安装 GtkOpenCV库,使用以下命令:

$ pacman -S mingw64/mingw-w64-x86_64-gtkmm3
$ pacman -S mingw64/mingw-w64-x86_64-opencv

使用 MinGW64 构建

要构建项目,打开MSYS2 MinGW 64-bit ,找到一个合适的文件夹(驱动单元映射到根文件夹,例如C:\Users\me\Document\Development\将是/c/Users/me/Development ):

$ cd navigate/to/your/project/folder
$ git clone https://github.com/cpp-tutorial/raspberry-cpp-gtk-opencv.git
$ cd raspberry-cpp-gtk-opencv
$ mkdir build
$ cd build
$ cmake -G"Unix Makefiles" ../src/
$ make
$ ./racapp.exe

如果你想用gdb调试,你可以使用稍微不同的cmake命令。如果您已经构建了项目,请不要犹豫,删除build文件夹并重新创建它:

$ cd ..
$ rm -rf build
$ mkdir build
$ cd build
$ cmake -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug ../src
$ make
$ gdb ./rascapp.exe

之后你在gdb 。要找到自己的方式,请查看Linux说明。

使MinGW工具随处可用

默认情况下, MSYS2 C:\Msys2\MinGW64\bin文件夹中安装库和工具。将其添加到PATH环境变量中,以便所有应用程序都可以找到这些工具:

完成后,您可以打开Windows命令行,并验证是否可以使用相同的工具:

$ pkg-config --version
$ pkg-config gtkmm-3.0 --cflags --libs
$ pkg-config opencv-3.0 --cflags --libs

如果您要使用 Code::Blocks ,这一步不是绝对必要的,但它也无妨。

在 Windows 中安装 Code::Blocks 并配置 MSYS2 工具链

Windows 中的默认 IDE 是Visual Studio 。但是, Visual Studio需要一种用于调试符号的特殊格式,该格式不是由MinGW 中的gccg++生成的。在跨平台项目中,如果您不想在超复杂的安装程序之后让您的生活变得悲惨,最好将其排除在外。

我选择Code::Blocks是因为:

  • 它存在于所有三个主要平台中,因此您可以在任何地方使用它,包括Raspberry Pi ,配置类似。
  • 它非常受欢迎,因此您可以寻找说明和社区支持。
  • 它有一个Windows安装向导,负责处理所有配置细节。

安装过程非常简单,至少在Windows 10 中

  1. 从官方站点安装Code::Blocks的 Windows二进制版本:http://www.codeblocks.org/downloads。
  2. 在所有版本中,选择正常设置(您在上一步中已经安装了 mingw 工具链)。
  3. 使用所有默认选项安装它。
  4. 启动程序

如果没有错误消息,您就完成了。否则,请查看故障排除。

用代码构建::块

最简单的方法是使用CMake为您准备一个Code::Blocks项目。假设您已经在已知位置克隆了项目,并且您的MSYS2 MinGW 64 位终端已经存在,这是命令序列:

$ mkdir codeb
$ cd codeb
$ cmake -DCMAKE_BUILD_TYPE=Debug -G"CodeBlocks - Unix Makefiles" ../src/

按照 Code::Blocks 中的其余程序进行操作:

  • 从菜单中文件→打开…,寻找codeb文件夹您刚刚创建,并为rascam.cbp在它的项目文件(注意,该项目的名称是在指定的相同CMakeLists.txt )。
  • 如果您愿意,请转到ProjectProject Tree并修改Display folder as on diskHide folder name
  • 选择一个源文件并通过单击灰色区域在其上放置一个断点。
  • 在工具栏中,选择rascapp目标。
  • 在工具栏中,启动调试器。
  • 它应该启动,并在断点处停止。
  • 要查看变量,请转到DebugDebugging windowsWatches

故障排除

无效或损坏的包(PGP 签名)

有时您在下载、更新或使用pacman升级时可能会发现以下错误消息:

(4/4) checking package integrity                                                                                 [###################################################################] 100%
error: jsoncpp: signature from "Alexey Pavlov (Alexpux) " 
is invalid
:: File /var/cache/pacman/pkg/jsoncpp-1.8.4-1-any.pkg.tar.xz is 
corrupted (invalid or corrupted package (PGP signature)).

这是一个与创作网站不可用相关的暂时性问题,您可以通过等待来解决它(参见“Alexey Pavlov (Alexpux)”中关于签名问题的讨论)。或者,您可以通过编辑/etc/pacman.conf (使用来自MinGW64 的Vim )并更改以下条目来停用签名检查:

SigLevel = Never

Code::Blocks 找不到编译器

在启动时, Code::Blocks可能会抱怨它没有找到编译器工具链。如果您已按上述方式使用 MSYS2安装它,则只是配置问题:

  • 在启动时,只需接受要求您选择现有工具链的对话框。
  • 在主菜单中,打开设置编译器…
  • 在对话框中,查找全局编译器设置部分和工具链可执行文件选项卡。
  • 确保路径正确。如果您使用默认选项安装 MSYS2 ,它应该是C:\msys64\mingw64
  • 还要确保所有提到的程序文件都对应于该文件夹中的现有可执行文件。
  • 接受所有内容,然后对SettingsDebugger 执行相同操作…

注意:当我使用mingw-setup安装 Code::Blocks时遇到了这个问题。我猜它需要标准的MinGW安装,而不是MSYS2安装。

Code::Blocks 无法保存配置

关闭应用程序或保存所有数据时, Code::Blocks可能会抱怨无法保存配置,并显示错误消息。要解决这个问题:

  • 记下它尝试保存配置文件的路径。
  • 创建相同的路径和同名的空文件。
  • 使这个文件可写。

注意:当我使用mingw-setup安装 Code::Blocks时遇到了这个问题。我猜它需要标准的MinGW安装,而不是MSYS2安装。