c++ - STL 和发布/调试库一团糟

标签 c++ linux gcc shared-libraries

我正在使用一些第 3 方。我正在使用它的共享库版本,因为该库很大 (~60MB) 并且被多个应用程序使用。

有没有办法在应用程序启动时找出库的发布/调试版本分别用于我的应用程序的发布/调试版本?

更长的描述

公开 C++ 接口(interface)的库。 API 方法之一返回 std::vector<std::string> .

当我在 Debug模式下编译我的应用程序时出现问题,应该使用库的调试版本。发布也一样。如果使用了错误版本的库,应用程序将崩溃。

根据 gcc(参见 http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt03ch17s04.html)

but with a mixed mode standard library that could be using either debug-mode or release-mode basic_string objects, things get more complicated

附言1

看起来 Timbo 的提议是一个可能的解决方案——对调试和发布库使用不同的 soname。那么,应该将什么传递给 ./configure 脚本来更改库 soname?

附言2

我的问题不在链接时,而是在运行时。

附言3

Here是展示我面临的问题的问题。

最佳答案

Debug模式引用 here与应用程序的调试或发布版本没有关系。 STL Debug模式用-D_GLIBCXX_DEBUG激活,是一种特殊的检查模式。

第 3 方库实际上不太可能是使用 STL 检查模式编译的,但如果是,它很可能会很快提到您的代码也应该使用 -D_GLIBCXX_DEBUG 编译。

如果第 3 方库不是通过检查 STL 构建的,那么无论您是在进行优化构建还是调试构建,它都与您的代码兼容。

由于您声明代码的调试版本与第 3 方库的优化版本相关联会导致崩溃,因此该崩溃很可能是由代码中的错误(或可能是由第 3 方库中的错误)引起的。

Valgrind 和 GDB 是您的 friend 。

关于c++ - STL 和发布/调试库一团糟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4764048/

相关文章:

c - 传递给链接器的库顺序

c++ - 将指针设置为一个值加上一个单独的值

c - C 标准库结构在 macOS 或 Linux 上的编译器和库版本之间是否兼容?

c++ - 指定默认参数的友元声明必须是一个定义

在 Geany 中工作的 Python 代码不在 IDLE 中?

linux - 将 .jpg 转换为 .eps 格式

c++11 参数包错误行为与 Apple LLVM 7.0.0 但适用于 GCC-5.1

c - 使用 C 从用户那里获取一些字符串输入

c++ - 动态迭代静态信息

c++ - 静态成员的问题