使用 CMake 和 MinGW Makefile 编译时 Vector push_back() 失败

Vector push_back() fails when compiling with CMake and MinGW Makefiles

我一直在整个互联网上搜索这个问题的解决方案,但是没有关于这个问题起源的好信息。本质上,每当我执行任何 vector-related 函数(例如 resize() 或使用给定大小初始化向量时,程序都无法 运行。

这是这个例子的当前项目结构:

example_project
│   CMakeLists.txt 
|
└───src
│   |    main.cpp
│   
└───build
    │   Example.exe
    │   ...

CMakeLists.txt:

cmake_minimum_required(VERSION 3.20.0)

project(Example)

# Retrieve all source files
file(GLOB_RECURSE SOURCE_FILES ${PROJECT_SOURCE_DIR}/src/main.cpp)

add_executable(Example ${SOURCE_FILES})

main.cpp:

#include <iostream>
#include <vector>

int main() {
  std::cout << "Test\n";
  
  // Example code
  std::vector<int> exampleVector;
  exampleVector.push_back(1);

  // Same applies to any other vector operation
  // Ex: std::vector<int> exampleVector(10);

  return 0;
}

此代码 运行 在通过终端从构建目录通过 cmake .. 使用 CMake 为 Visual Studio 编译时很好。但是,我想在没有任何 IDE 的情况下构建这个项目,因此我想直接用 CMake 编译它,同时仍然能够使用另一个文本编辑器。因此,我认为“MinGW Makefiles”是一个不错的选择。

构建和运行应用程序:

> cmake -G "MinGW Makefiles"  -DCMAKE_EXPORT_COMPILE_COMMANDS=ON  ..
> make

以上命令执行无任何错误。然后 运行ning Example.exe 产生:

我在 CMake 方面相当缺乏经验,因此我将不胜感激任何有关构建项目的更好解决方案的反馈。但是 bottom-line 是我想使用 CMake 来管理大型项目,而不必使用任何 IDE 或 solution-file 系统,例如 MSVC,只是用于构建的终端和 运行宁的应用程序。矢量标准 header 似乎是问题所在。提前致谢!

编辑:

看来问题与必要库的静态链接有关。因此,我找到的解决方案是包括 g++ 的静态标志之一,例如 -static-static-libstdc++ 等。为了告诉 CMake 在编译时自动执行此操作,我只是将其添加为标志:

set(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++")

话虽这么说,但我仍然对实际执行此操作的必要性以及这是否是首选解决方案或 use-case 静态链接有很多疑问。