如何在 Visual Studio 2017 年构建和调试 MSYS2 / MinGW64 / CMake 项目?

How to build and debug a MSYS2 / MinGW64 / CMake project in Visual Studio 2017?

我已经使用 MSYS2 / MinGW64 / CMake 工具成功构建了一个 C++ 项目。现在我想在 Visual Studio 中对其进行编辑和调试,因为它是一个不错的 IDE 并且是 Windows 中的默认开发工具。遗憾的是,我无法在 Visual Studio 中构建项目,因为它找不到库。

这是我正在使用的 CMakeLists.txt 文件,除其他外,我指定了包含文件夹、link 文件和 link 目录的位置:

# src/CMakeLists.txt
cmake_minimum_required(VERSION 3.3 FATAL_ERROR)

# Project name and current version
project(rascam VERSION 0.1 LANGUAGES CXX)

# Enable general warnings
# See http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")

# Use 2014 C++ standard.
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Must use GNUInstallDirs to install libraries into correct locations on all platforms:
include(GNUInstallDirs)

# Pkg_config is used to locate header and files for dependency libraries:
find_package(PkgConfig)

# Defines variables GTKMM_INCLUDE_DIRS, GTKMM_LIBRARY_DIRS and GTKMM_LIBRARIES.
pkg_check_modules(GTKMM gtkmm-3.0) 
link_directories( ${GTKMM_LIBRARY_DIRS} )
include_directories( ${GTKMM_INCLUDE_DIRS} )

# Compile files:
add_executable(rascapp
    cpp/main.cpp    
    cpp/main-window.cpp
)

# Add folder with all headers:
target_include_directories(rascapp PRIVATE hpp)

# Link files:
target_link_libraries(rascapp
   ${GTKMM_LIBRARIES}  
)

为了设置我的环境,我在 Windows 平台上安装了 MSYS2,并通过 pacman 添加了以下所有包:

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

我的项目依赖于Gtkmm,所以我添加了以下依赖:

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

然后我将 C:\Msys2\MinGW64\bin 添加到路径中。

然后,我切换到 MSYS2/MinGW64 终端,获取我的项目,创建一个 build 文件夹并构建它。正如我在 Windows 中,CMake 默认生成 Visual Studio 文件。我会同意的,只要我能让它工作。 运行 出于想法,我指定了 Unix Makefiles 选项:

cd /c/where/your/root/folder/is
git clone https://github.com/cpp-tutorial/raspberry-cpp-gtk-opencv.git
cd raspberry-cpp-gtk-opencv
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug -G"Unix Makefiles" ../src/
make
./racapp.exe

这确实构建了项目。它生成一个可执行文件,我可以通过双击它从 MinGW64 或 Window Explorer 启动它。我也可以gdb

检查项目看起来正确后,我尝试通过两种不同的方式在 Visual Studio Community 2017 15.9.3 中打开它:

  1. 使用CMake构建一个Visual Studio项目:Visual studio打开项目,我可以看到不同的目标,但是当我启动调试会话时,它会抱怨找不到 Gtk 库。查看项目属性,我可以看到库取自正确的路径 C:\Msys2\MinGW64\bin。我验证了该库存在,尽管名称不同:libgtkmm-3.0.dll.a 而不是 gtkmm-3.0.dll.
  2. 使用Visual Studio的打开文件功能:再次打开项目,我可以看到目标和源文件,但它抱怨说没有找到包含文件 gtkmm.h。我还没有达到 link 阶段,但我的猜测是它找不到库。

我的问题是,在 Visual Studio 中构建和调试 MSYS2 / MinGW64 / CMake 项目的正确和标准方法是什么?

正如其他用户评论的那样(感谢@DavidGrayson),安装在 MSYS2 配置中的 gcc.exeg++.exe 编译器不使用Visual Studio 调试符号所需的格式。因此,无法使用 Visual Studio 来调试使用 Mingw 构建的可执行文件。

为了能够调试(以及构建和编辑),请使用其他一些 IDE,更加 MinGW 友好,例如 Code::Blocks .

不过,为了回答我自己的问题,我在这里描述了在 Visual Studio 中配置项目以编辑源文件、构建和启动可执行文件的过程。对于此过程,无需对任何内容使用 CMake

  1. 2017 年 Visual Studio 发布
  2. 文件 -> 打开 -> 文件夹...
  3. Select 包含顶部 CMakeLists.txt.
  4. 的文件夹
  5. 应该会自动发现这是一个CMake工程,并尝试加载它。也许它会抱怨一些错误。
  6. CMake -> 更改 CMake 设置 -> 选择你的顶部 CMakeLists.txt.
  7. 在对话框中,寻找Mingw64-Release(其实有一个*Mingw64-Debug,但无论如何你都无法调试)。
  8. 如果一切顺利,CMakeSettings.json 出现在您的项目中,Visual Studio 重建项目,这次没有错误。
  9. 选择一个可执行目标。
  10. 启动。

它应该构建然后执行应用程序。