【问题标题】:How to build and debug a MSYS2 / MinGW64 / CMake project in Visual Studio 2017?如何在 Visual Studio 2017 中构建和调试 MSYS2 / MinGW64 / CMake 项目?
【发布时间】:2018-12-06 13:02:32
【问题描述】:

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

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

# 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。我还没有达到链接阶段,但我猜它找不到库。

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

【问题讨论】:

  • 在 Windows 上使用 Cmake 时,它​​永远不会为我生成 Visual Studio 文件,除非我将 VS 指定为生成器。为什么不在 Cmake 中选择 MSYS Makefiles 选项并在 MSYS2 终端中使用生成的 makefile 编译程序?
  • 如问题中所述,我可以在 MSYS2/MinGW64 中构建项目,它会生成一个有效的可执行文件。我想要实现的是在 Visual Studio 中进行编辑和调试。因为它是一个不错的 IDE。
  • 据我所知,Visual Studio 和 MSYS2 之间没有集成。此外,您不应期望使用 MSVC 编译的二进制文件与来自 GCC 的二进制文件兼容,反之亦然。我认为 Visual Studio 调试器还使用一种特殊的调试信息格式,称为 PDB,GCC 不支持这种格式。你真的只是想在这里合并两个完全独立的世界。没有标准的方法可以做到这一点。
  • @DavidGrayson 正如您所提到的,我仔细查看了编译选项,事实证明您可以使用预配置的调试设置,其中之一是 MinGW64 调试。有了它,我可以构建和启动项目。但我无法调试它;我可以看到调试的 -g 选项,但我猜你是对的,调试符号格式与 Visual Studio 不兼容。

标签: c++ visual-studio cmake mingw msys2


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多