我最近将我的开发机器升级到 Ubuntu 16.04(全新安装,擦除 14.04)
gcc 的默认版本是gcc-5.3.1
.
我遇到的一个问题是供应商提供的库仅使用 gcc-4.9 构建,它与 gcc-5 不兼容。
我已要求供应商提供该库的新版本,但短期内不太可能发生这种情况。
与此同时,我已经gcc-4.9.3
从 Ubuntu 的软件包仓库安装了。
我现在安装了 gcc-4.9 和 gcc-5:
ls -l /usr/bin/gcc*
lrwxrwxrwx 1 root root 5 May 9 11:49 /usr/bin/gcc -> gcc-5
-rwxr-xr-x 1 root root 838008 Apr 13 23:23 /usr/bin/gcc-4.9
-rwxr-xr-x 1 root root 915704 Apr 13 11:29 /usr/bin/gcc-5
我尝试使用 gcc-4.9 构建我们的源代码,但现在我遇到了相同的 ABI 问题,但方向相反。
我遇到的问题是我们有一堆依赖项,我们通常会从发行版包中安装这些依赖项
sudo apt-get install \
python-dev \
libbz2-dev \
libboost-all-dev \
libprotobuf-dev \
libgoogle-perftools-dev \
postgresql \
libpqxx-dev
虽然我可以将我的构建配置为使用 gcc-4.9
mkdir build && cd build
CC=/usr/bin/gcc-4.9 CXX=/usr/bin/g++-4.9 cmake ..
make -j8
我现在在链接时遇到链接器错误libtcmalloc_minimal.a
,libprotobuf.a
等等。
因此,我尝试的下一步是删除从发行版存储库中安装的所有依赖项,并开始从源代码构建依赖项。
CC=/usr/bin/gcc-4.9 CXX=/usr/bin/g++-4.9 ./configure
make -j8
sudo make install
这里的问题是我开始陷入困境。每个依赖项都有其他依赖项,我不确定它会在哪里结束。
另一种选择是降级回 Ubuntu 14.04 或带有 gcc-4.9 而不是 gcc-5 的某些版本。
在我尝试这个 thurmonuclear 选项之前,我想知道是否有更好的方法来做到这一点?
也许可以从使用 gcc-4.9 或其他方式构建的 repos 安装?
您遇到的问题与需要 C++ 字符串(和列表)类型的不同实现的 C++11 标准有关。为了兼容性,g++5.2及以上默认编译新的C++11兼容类型,(无论是否指定-std=c++11),但可以设置宏
恢复到旧的 C++ 字符串类型。新的 libstdc++ 实现包含两个ABI。因此,如果您有必须与旧的不兼容 ABI 链接的二进制文件,则必须在 g++ 编译中设置上述宏。这应该会生成与旧 ABI 兼容的二进制文件。
不幸的是,如果您使用的是操作系统中的库而不是 C++ 标准库,那么除非这些库是多架构的,因为它们在两个ABI 中都提供了与 ABI 不同的所有功能,那么您就搞砸了,因为它们可能只会拥有新的 ABI。
话虽如此,我在旧 Ubuntu 上下载不受信任的现代 g++ 时遇到问题,它只是拒绝生成新的 ABI。因此,似乎 backport from
ppa:ubuntu-toolchain-r/test
实际上被严重破坏了,因为它拒绝根据新的 ABI 生成二进制文件。无论如何,当您将所有内容链接在一起时,底线必须是旧 ABI 或新 ABI。以下将告诉您正在使用哪个:
如果有
在其中,它是旧的ABI。如果有
其中,它是新的ABI。
按:转到 tty1:
CTRL+ALT+F1
使用以下命令清除 gcc-5.3.1:
并使用以下命令安装 gcc-4.9.3:
注意:这需要互联网连接!
最好使用-D_GLIBCXX_USE_CXX11_ABI=0。但是你也可以使用g++的这个选项,甚至可以更好