在 minGW-W64 g++ 中编译的 C++ 代码不能在 Ubuntu g++ 中编译

Posted

技术标签:

【中文标题】在 minGW-W64 g++ 中编译的 C++ 代码不能在 Ubuntu g++ 中编译【英文标题】:C++ code compiling in minGW-W64 g++ does not compile with Ubuntu g++ 【发布时间】:2016-03-13 14:51:40 【问题描述】:

我在运行 Ubuntu 的工作站上编译我在 Windows 10 Code::Blocks 环境中编写的程序时遇到了一些问题。

具体来说,代码没有问题的编译器是

g++ (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 5.3.0*

而编译器抱怨代码是

g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2

后者抱怨多段代码,包括 Alglib 库的各个部分以及 Numerical Recipes NR3 库的重载 throw() 定义。

我可以绕过使用上面的两个库,但不明白为什么我为我的一个类编写的 has 函数会出现问题。它给了我一个

错误:“类型名称”声明为返回函数的函数

换行

for(auto& P : n) res = res ^ ((std::hash<double>()(double(int(P))) ) << ct++  );

其中 n 是一个 stl 整数向量和类的成员。 所以我的问题是:

    为什么 Ubuntu g++ 编译器不遵循与 MinGW g++ 相同的标准? (是否可以在 Ubuntu 上更改为遵循相同标准的某些版本的 g++)

    我的哈希函数中的行有什么歧义(哈希函数的效率/质量目前并不那么重要)

【问题讨论】:

【参考方案1】:

您将此问题标记为 c++11,因此我假设您正在按照该标准进行编译。 g++-4.8 是第一个声明完全支持 c++11 的版本,但它仍然被描述为“实验性”。 https://gcc.gnu.org/gcc-4.8/cxx0x_status.html。另外我认为当时的标准库支持也不完整。

g++-4.9 是首先获得真正良好支持的地方,所有部件都已到位并修复了主要缺陷。

如果您运行的是 Ubuntu Wily,默认的 g++ 版本是 5.3,与您的 mingw 相同。

如果您使用的是较旧的 Ubuntu,您可以添加 toolchain/test apt-repository 并专门下载 g++-4.9 或更高版本。

以下是有关如何执行此操作的一些说明:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install g++-4.9

参考:https://askubuntu.com/questions/428198/getting-installing-gcc-g-4-9-on-ubuntu


要提供有关您的错误的具体信息,您需要显示比这更多的代码。这听起来像是某种语法错误,但根据您展示的小代码,很难说它是由语言特性、标准库元素还是组合引起的。


另一种选择是在您的旧 Ubuntu 上使用 clang++。根据我的经验,clang-3.6 对 C++11 有很好的支持,并且比当代的 gcc 版本更快地被 Ubuntu 接受,因此您可以使用它并让您的项目编译而无需添加 toolchain-r/test .

【讨论】:

以上是关于在 minGW-W64 g++ 中编译的 C++ 代码不能在 Ubuntu g++ 中编译的主要内容,如果未能解决你的问题,请参考以下文章

Windows下的 C++ 编译工具(MinGW-w64 + CMake)

windows中使用mingw64编译dlib的c++

如何在vscode中编写C和C++

使用 Mingw-w64 交叉编译 CGAL

传递指向成员函数的指针在 MinGW-w64 中编译,但不在 gcc 中

C语言编译器” MinGW-w64 C/C++”的安装