c++:如何删除 libstdc++.so.6 依赖项

c++: How to remove libstdc++.so.6 dependencies

我有 2 个程序是我在 windows 计算机上使用 Visual Studio 2013 编写的。它们 运行 在我的计算机上运行良好并且运行良好,但是当我将它们带到我的学校时Linux 机器上的帐户,出现了问题。他们编译了1个运行,但是另一个没有。没有运行的给我报错:

.../lib/compat/libstdc++.so.6: version CXXABI_1.3.2 required by...

我一直在进行研究,但我似乎无法找出我的程序中将使用 libstdc++.so.6 的内容,我什至不确定它是什么或做什么。由于我使用的是学生帐户,因此我无法使用 sudo 安装它,而且这是一项作业,因此我无法使用我自己的库提交它。

关于我的程序可能使用的需要 libstdc++.so.6 的任何想法?

我有 3 个文件:main.cpp、LinkedList.cpp 和 LinkedList.h。

我认为它可能在 main.cpp 中,因为我认为它源于我包含的库,而 main.cpp 是唯一使用外部库的库。这是它使用的库列表:

#include <iomanip>
#include <stdio.h>
#include <fstream>
#include <ctype.h>
#include <string>
#include <iostream> 
#include <vector>
#include <sstream>
#include <bitset>
#include <algorithm>
#include "LinkedList.h"

提前致谢!

您正在尝试 运行 一个程序链接到另一组库的一个版本。 应该 可以正常工作,只要库版本相距不是太远。在你的情况下,图书馆之间的差异太大了。

GCC(尤其是 C++)最近发生了很大的变化,一些过去可以编译并且 运行 很好的程序现在崩溃了或者根本不编译(由于语言变化,编译器错误接受损坏的代码,...),库 ABI 也发生了变化。最好的办法是随身携带源代码,并确保两端都有兼容的语言版本。如果这样做不方便,一个解决方案是确保您在两个地方都有相同的编译器(和其他环境)。最简单的方法是安装相同的发行版和版本。

首先你不能删除libstdc++.so.6的依赖,因为它是一个标准的C++库。 要解决您的问题,您必须检查您的 libstdc++.so 是否具有正确的版本

strings /usr/lib64/libstdc++.so.6|grep GXXABI_1.3.1

如果没有匹配的版本,您将有如下两种方法:

  1. 更新你学校的 gcc linux OS

    yum intsall gcc

  2. 从该网站下载匹配的 libstdc++.so: download gcc || download matching libstdc++ 然后将 libstdc++.so 替换为 /usr/lib64/libstdc++.so.6.*

解决方案

我通过几个步骤找到了我的解决方案。本来我可以编译我的程序,但不能 运行 它。

1) 我解决这个问题的第一步是改变我的编译方法。最初我用以下内容编译我的程序:g++ main.cpp LinkedList.cpp -o output。我将其更改为:g++ -static main.cpp LinkedList.cpp -o output 允许我编译和 运行。这行得通,但静态是动态 link 库的一种方法。这会阻止 link 使用共享库。这不是一个好的解决方案,因为它需要更长的时间并增加可执行文件的文件大小,所以我想改进。

2) 我做的第二件事是删除 using namespace std。是的,我作弊并使用了它。所以我检查了我的程序并将 std:: 添加到适当的位置。

3) 我做的最后一件事是清理我的代码。我使用了很多库,因为我的程序又大又复杂。我使用了我在原始 post 中列出的所有库。我浏览了我的代码,在任何使用库函数的地方,我都会尝试编写自己的代码来做同样的事情,这会导致我的程序不依赖于那些库。我能够用我自己的代码复制相当数量的这些依赖的外部函数,这增加了很多代码,但它允许我删除其中的一些包含。我的包含列表现在是:

#include <fstream>
#include <string>
#include <iostream> 
#include <vector>
#include <algorithm>
#include "LinkedList.h"
#include <math.h>

我不确定具体是哪一步解决了我的问题,但现在我可以使用我喜欢的方法 g++ main.cpp LinkedList.cpp -o output 进行编译,并且我的程序 运行 没问题。

我希望这对某人有所帮助。