C++11 如何使用c++;11?

C++11 如何使用c++;11?,c++11,g++,ubuntu-10.04,C++11,G++,Ubuntu 10.04,我们已经开始使用跨平台构建工具tundra2在不同平台上构建应用程序二进制文件。它工作得很好 然而,现在我们需要瞄准Ubuntu 10.04。不幸的是,如果不对源代码进行重大修改,就不可能将tundra2编译到Ubuntu10.04上,因为它使用了GCC4.4中没有的许多c++11特性。我可以升级到一个更新的gcc,但不能编译代码 所以我想我应该尝试在更新的平台上构建tundra2,并将tundra2二进制文件复制到10.04上。不幸的是,我遇到了以下错误: (lucid_amd64)matt@

我们已经开始使用跨平台构建工具tundra2在不同平台上构建应用程序二进制文件。它工作得很好

然而,现在我们需要瞄准Ubuntu 10.04。不幸的是,如果不对源代码进行重大修改,就不可能将tundra2编译到Ubuntu10.04上,因为它使用了GCC4.4中没有的许多c++11特性。我可以升级到一个更新的gcc,但不能编译代码

所以我想我应该尝试在更新的平台上构建tundra2,并将tundra2二进制文件复制到10.04上。不幸的是,我遇到了以下错误:

(lucid_amd64)matt@blaze:~/dev/OTOY2/extern/tundra2/build$ ./tundra2 
./tundra2: /lib/libc.so.6: version `GLIBC_2.14' not found (required by ./tundra2)
./tundra2: /lib/libc.so.6: version `GLIBC_2.15' not found (required by ./tundra2)
我尝试将g++与-static libstdc++和-static libgcc选项进行静态链接,但错误仍然存在

这就提出了一个问题。如何针对具有较新编译器功能的较旧平台? 我应该试着在Ubuntu 10.04上编译GCC4.8吗


在阅读和学习了一些关于GNUCLinker的知识之后,比我想象的要多。似乎导致依赖性的函数是2.15中引入的一个名为u fdelt_chk的函数。 与范围检查有关。我将尝试关闭它或为它实现一个虚拟。此外,memcpy还需要2.14版本,这在Ubuntu 10.04上是不可用的


编辑。 似乎在2.14和2.15中引入了两个常见的更改。 在2.14中,我读到memcpy在内部被更新为memmove调用。 在2.15中,引入了内存边界检查(这就是u fdelt_chk)的内容

从这个例子中,如果C++运行时是静态链接的,则没有理由二进制不能在10.04和CCENS 5.5上运行。 那么我们如何处理这些问题呢?我试过memcpy包装器,但由于某种原因,它不起作用。它仍然试图寻找2.14。将-fno stack protector和-U_FORTIFY_SOURCE放在编译行和链接行的末尾,实际上并没有删除它。我还与其他库(如pthreads)链接,所以我不知道这是否需要它

看起来,寻找这个问题的解决方案实际上是很常见的,并且没有通用的解决方案。我想我应该试着在10.04上编译GCC4.8,看看效果如何

如果不对源代码进行重大修改,就不可能将tundra2编译到Ubuntu10.04上


从源代码处安装最新和最好的gcc版本。

我想也许我可以静态编译它。不管二进制文件的大小是50MB还是200KB,根据Ubuntu 10.04和Ubuntu13.10上strings/lib/ld.so.6 | grep GLIB的输出,我应该能够针对GLIBC 2.11,它应该可以工作。我能告诉编译器允许2.11 glibc min吗?是的,这是一个同事建议的。。。要将gcc编译到10.04。。。然后将二进制文件检查到源代码树中,我们可以仅为该平台进行安装。您将能够在具有更高版本glibc的系统上使用在那里生成的二进制文件。事实证明,这绝对是最简单的方法。尽管说实话,编译gcc是一个困难的过程。部分原因是我在virtualbox虚拟机上花了太长时间。我基于它为我工作的过程是这样的: