注意:我的回答更多基于[SO]: openCV mingw-32 error in cmd(发布的.pdf中提到的工具版本)
1。初步考虑
一开始,我尝试使用我机器上已有的东西来构建它(Win 10):
构建过程通过了这个阶段(嗯,它在这个点以下的某个地方失败了,我没有检查确切的原因)。
无论如何,我认为我使用的构建环境和建议的环境太远了,所以我:
- 已下载 CMake 3.6.3 Win x64 包(包含 cmake-gui - 作为 cmdline 可以一种痛苦,尤其是对于那些不习惯的人)
- 使用 MinGW 5.3.0(我的 Qt 安装的一部分)
其核心问题(如 cmets 中所述,或 Google 指出错误)是 g++ 编译器不使用 C++ 11 标准(protobuf 源代码需要它)。
所以,我做了一个小测试:将错误代码粘贴到一个文件中(并添加了一个虚拟 main),并在 2 个 MinGW 安装中进行了尝试。
code00.cpp:
template <typename char_type>
bool null_or_empty(const char_type *s) {
return (s == nullptr) || (*s == 0);
}
int main() {
return 0;
}
输出:
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q049459395]> sopr.bat
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***
[prompt]> dir /b
build
build.bat
cmake-gui.exe - Shortcut.lnk
code.cpp
src
[prompt]> set _PATH=%PATH%
[prompt]> set PATH=%_PATH%;c:\Install\x64\MinGW32\MinGW32\7.2.0-posix-seh-rt_v5-rev1\mingw64\bin
[prompt]> "c:\Install\x64\MinGW32\MinGW32\7.2.0-posix-seh-rt_v5-rev1\mingw64\bin\g++" code.cpp
[prompt]> "c:\Install\x64\MinGW32\MinGW32\7.2.0-posix-seh-rt_v5-rev1\mingw64\bin\g++" --version
g++ (x86_64-posix-seh-rev1, Built by MinGW-W64 project) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[prompt]> dir /b
a.exe
build
build.bat
cmake-gui.exe - Shortcut.lnk
code.cpp
src
[prompt]> del /q a.exe
[prompt]> set PATH=%_PATH%;c:\Install\Qt\Qt\Tools\mingw530_32\bin
[prompt]> "c:\Install\Qt\Qt\Tools\mingw530_32\bin\g++" code.cpp
code.cpp: In function 'bool null_or_empty(const char_type*)':
code.cpp:3:17: error: 'nullptr' was not declared in this scope
return (s == nullptr) || (*s == 0);
^
[prompt]> "c:\Install\Qt\Qt\Tools\mingw530_32\bin\g++" --version
g++ (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 5.3.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[prompt]> "c:\Install\Qt\Qt\Tools\mingw530_32\bin\g++" code.cpp -std=c++0x
[prompt]>
正如所见,旧的 g++ 需要-std=c++0x 明确。
按照构建步骤,我得到了与下图相同的错误(我直接在 protobuf 的目录中启动了 mingw32-make,以跳过所有其他在它之前构建的东西):
2。解决方案
两者都是在 cmake-gui 级别完成的。设置路径后:
- 点击“配置”
- 进行所需的变量更改
- 点击“生成”
- 从控制台启动 mingw32-make,在构建目录中
注意事项:
2.1 强制C++11标准
点击“添加条目”并设置[CMake 3.1]: CXX_STANDARD:
在下面,请注意构建通过了之前失败的点:
2.2 跳过 Protobuf 构建
注意事项:
- 在发布的电影中,没有尝试构建 Protobuf(可能它不在捆绑包中?)这就是没有弹出此错误的原因
- 我不知道最终构建中不会提供哪些功能,因为我不知道 Protobuf 使用的是什么
- 我认为这更像是一种解决方法
搜索 Protobuf 相关变量,并取消选中 BUILD 或 WITH 组中的任何变量( 蓝色线):
效果再次如下 - Protobuf 构建不再发生(它就在 libIlmImf 之后):