要理解问题,我应该告诉您更多关于加载动态库的程序。它是半衰期专用服务器。它使用位于可执行文件旁边的旧libstdc++。为了避免出现问题,在使用新标准库的特性时,我通常会将我的项目状态链接到libstdc++。
我的朋友告诉我,如果加载了使用不同编译器库编译的2种编译器,或者当我从服务器调用函数(这是在内部用旧的libstdc++实现的)时,libstdc++静态链接可能会产生问题。
是真的吗?我怎样才能解决这个问题?
发布于 2017-06-28 17:46:31
共享库公开的API必须使用主机应用程序所期望的相同的ABI,即所涉及的类型必须具有相同的布局、大小和对齐方式。
如果在API中公开了std::类型,或者它引发C++异常,那么这意味着必须使用定义的标准库头和宏来编译共享库。在这种情况下,您可以动态链接到主机应用程序附带的libstdc++。
如果API中没有公开的std::类型,并且没有从共享库引发异常,则可以静态地链接到libstdc++。但是,所有外部符号仍将从共享库中公开,因此当没有dlopen标志的调用加载它时,如果它们可用,它将使用来自主机应用程序的相同名称的符号,而不是您希望静态链接的符号,这可能会导致您的朋友可能引用的未定义行为。为了避免这种情况,需要一个链接器版本脚本来使共享库中的所有符号都是本地的,并且只将API符号公开为全局的。类似于:
MYHALFLIFEPLUGIN_0.0 {
global: half_life_foo,half_life_bar; # Explicitly list symbols to be exported.
local: *; # Hide everything else.
};并指示链接器与-Wl,--version-script=<filename>编译器链接器选项(LDFLAGS)一起使用此脚本。除了-static-libstdc++选项之外,您还需要-static-libgcc链接器选项。
同时,通读一遍
了解更多详细信息。
发布于 2017-06-27 15:18:32
是的是真的。最简单的示例是,如果在库中使用new创建对象,在另一个不使用相同STL的库中创建delete。
你有两个解决方案:
https://stackoverflow.com/questions/44783614
复制相似问题