注意:我的答案更多基于[SO]:cmd中的openCV mingw-32错误(发布的.pdf中提到的工具版本)
一、初步考虑
一开始,我尝试使用我机器上已有的东西(Win 10)来构建它:
构建过程通过了这个阶段(好吧,它在这个点以下的某个地方失败了,我没有检查确切的原因)。无论如何,我认为我使用的构建环境和建议的环境太远了,所以我:
- 下载的CMake 3.6.3 Win x64包(包含cmake-gui - 因为cmdline可能会很痛苦,尤其是对于那些不习惯它的人)
- 使用MinGW 5.3.0(我的Qt安装的一部分)
其核心问题(如注释中所指定,或Google指出错误)是g++编译器不使用C++11标准(并且protobuf源代码需要它)。
所以,我做了一个小测试:将错误代码粘贴到一个文件中(并添加了一个虚拟main),并在 2 个MinGW安装中进行了尝试。
代码00.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之后):