链接到特定的stdc++;图书馆 我有一个C++应用程序,我想在Linux下构建它,它需要链接到第三方共享库,但是这个库是用一个非常新版本的GCCC/GLIMC(4.83/3)构建的。当我尝试使用较新版本的GCC/glibc(4.4.7/2.12)构建我的应用程序时,构建的链接阶段失败,ld抱怨未定义的引用,这些引用是对更新的libstdc++中定义的函数的引用

链接到特定的stdc++;图书馆 我有一个C++应用程序,我想在Linux下构建它,它需要链接到第三方共享库,但是这个库是用一个非常新版本的GCCC/GLIMC(4.83/3)构建的。当我尝试使用较新版本的GCC/glibc(4.4.7/2.12)构建我的应用程序时,构建的链接阶段失败,ld抱怨未定义的引用,这些引用是对更新的libstdc++中定义的函数的引用,c++,gcc,libstdc++,C++,Gcc,Libstdc++,第三方已经给了我一个libstdc++和libgcc_的预编译版本,可以与库一起使用,但是我如何在构建中使用这些版本呢 我如何告诉GCC使用预编译库而不是系统库,同时仍然使用系统GCC 我尝试过使用“-nodefaultlibs”选项并包括“-lstdc++”和“-L”选项,但它似乎对未定义的引用没有影响 链接过程中出现的错误示例: 未定义对std::\uuuuuu throw\u bad\u function\u call()@GLIBCXX\u 3.4.14的引用 对std::length_

第三方已经给了我一个libstdc++和libgcc_的预编译版本,可以与库一起使用,但是我如何在构建中使用这些版本呢

我如何告诉GCC使用预编译库而不是系统库,同时仍然使用系统GCC

我尝试过使用“-nodefaultlibs”选项并包括“-lstdc++”和“-L”选项,但它似乎对未定义的引用没有影响

链接过程中出现的错误示例:

未定义对std::\uuuuuu throw\u bad\u function\u call()@GLIBCXX\u 3.4.14的引用

对std::length_error::~length_error()@GLIBCXX_3.4.15'

我通过在链接命令的对象列表中指定libstdc++和libgcc_共享对象的完整路径(例如/home/mike/Downloads/libstdc++.so.6),成功地构建了应用程序。这样,我不需要使用任何附加选项,例如“-nostlibs”,只需要确保在运行应用程序时链接的共享对象通过LD_LIBRARY_路径可用

我知道这不是一个直接的答案,但是你可能想努力去构建一个与你的版本(和你的编译器版本)相适应的潮流,现在就认真考虑,并且认真考虑一下未来的另一个第三方库,如果可以的话。乍一看,他们似乎犯了一个典型的设计错误,即跨库边界传递std对象(如异常)。这最终将成为开发和分发过程的绝对地狱,特别是当您的项目涉及其他依赖项时。顺便说一句,仅仅更改库本身是不够的,您还必须确保包含准确对应的stdc++头,因此,模板化的内容也匹配。您所做的应该是有效的。尝试传递
-v
以查看gcc是如何调用链接器的。@Nemo如果没有使用匹配的头,它就不一定能工作,例如
~length\u error()
可以在一个版本中内联定义,但在另一个版本中不能。@JasonC:我认为只要更改库就可以了,假设(a)这是一个动态库,(b)主代码是相同的,否则旧的二进制文件将无法在新系统上运行。这就是为什么在名称中会看到带有版本控制信息的符号(如
@@GLIBCXX_3.4.14
)。虽然我同意这是一个糟糕的做法。