【发布时间】: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 中以两种不同的方式打开它:
- 使用 CMake 构建 Visual Studio 项目:Visual Studio 打开项目,我可以看到不同的目标,但是当我启动调试会话时,它抱怨它找不到 Gtk 库。查看项目属性,我可以看到这些库来自正确的路径
C:\Msys2\MinGW64\bin。我验证了该库存在,尽管名称不同:libgtkmm-3.0.dll.a而不是gtkmm-3.0.dll。 - 使用 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