使用 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 静态链接有很多疑问。
我一直在整个互联网上搜索这个问题的解决方案,但是没有关于这个问题起源的好信息。本质上,每当我执行任何 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 静态链接有很多疑问。