如何在 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 中打开它:
- 使用CMake构建一个Visual Studio项目:Visual studio打开项目,我可以看到不同的目标,但是当我启动调试会话时,它会抱怨找不到 Gtk 库。查看项目属性,我可以看到库取自正确的路径
C:\Msys2\MinGW64\bin
。我验证了该库存在,尽管名称不同:libgtkmm-3.0.dll.a
而不是 gtkmm-3.0.dll
.
- 使用Visual Studio的打开文件功能:再次打开项目,我可以看到目标和源文件,但它抱怨说没有找到包含文件
gtkmm.h
。我还没有达到 link 阶段,但我的猜测是它找不到库。
我的问题是,在 Visual Studio 中构建和调试 MSYS2 / MinGW64 / CMake 项目的正确和标准方法是什么?
正如其他用户评论的那样(感谢@DavidGrayson),安装在 MSYS2 配置中的 gcc.exe
和 g++.exe
编译器不使用Visual Studio 调试符号所需的格式。因此,无法使用 Visual Studio 来调试使用 Mingw 构建的可执行文件。
为了能够调试(以及构建和编辑),请使用其他一些 IDE,更加 MinGW 友好,例如 Code::Blocks .
不过,为了回答我自己的问题,我在这里描述了在 Visual Studio 中配置项目以编辑源文件、构建和启动可执行文件的过程。对于此过程,无需对任何内容使用 CMake:
- 2017 年 Visual Studio 发布
- 文件 -> 打开 -> 文件夹...
- Select 包含顶部
CMakeLists.txt
. 的文件夹
- 应该会自动发现这是一个CMake工程,并尝试加载它。也许它会抱怨一些错误。
- CMake -> 更改 CMake 设置 -> 选择你的顶部
CMakeLists.txt
.
- 在对话框中,寻找Mingw64-Release(其实有一个*Mingw64-Debug,但无论如何你都无法调试)。
- 如果一切顺利,
CMakeSettings.json
出现在您的项目中,Visual Studio 重建项目,这次没有错误。
- 选择一个可执行目标。
- 启动。
它应该构建然后执行应用程序。
我已经使用 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 中打开它:
- 使用CMake构建一个Visual Studio项目:Visual studio打开项目,我可以看到不同的目标,但是当我启动调试会话时,它会抱怨找不到 Gtk 库。查看项目属性,我可以看到库取自正确的路径
C:\Msys2\MinGW64\bin
。我验证了该库存在,尽管名称不同:libgtkmm-3.0.dll.a
而不是gtkmm-3.0.dll
. - 使用Visual Studio的打开文件功能:再次打开项目,我可以看到目标和源文件,但它抱怨说没有找到包含文件
gtkmm.h
。我还没有达到 link 阶段,但我的猜测是它找不到库。
我的问题是,在 Visual Studio 中构建和调试 MSYS2 / MinGW64 / CMake 项目的正确和标准方法是什么?
正如其他用户评论的那样(感谢@DavidGrayson),安装在 MSYS2 配置中的 gcc.exe
和 g++.exe
编译器不使用Visual Studio 调试符号所需的格式。因此,无法使用 Visual Studio 来调试使用 Mingw 构建的可执行文件。
为了能够调试(以及构建和编辑),请使用其他一些 IDE,更加 MinGW 友好,例如 Code::Blocks .
不过,为了回答我自己的问题,我在这里描述了在 Visual Studio 中配置项目以编辑源文件、构建和启动可执行文件的过程。对于此过程,无需对任何内容使用 CMake:
- 2017 年 Visual Studio 发布
- 文件 -> 打开 -> 文件夹...
- Select 包含顶部
CMakeLists.txt
. 的文件夹
- 应该会自动发现这是一个CMake工程,并尝试加载它。也许它会抱怨一些错误。
- CMake -> 更改 CMake 设置 -> 选择你的顶部
CMakeLists.txt
. - 在对话框中,寻找Mingw64-Release(其实有一个*Mingw64-Debug,但无论如何你都无法调试)。
- 如果一切顺利,
CMakeSettings.json
出现在您的项目中,Visual Studio 重建项目,这次没有错误。 - 选择一个可执行目标。
- 启动。
它应该构建然后执行应用程序。