C++ C++;如果在多个共享lib和libstdc++;已启用静态链接
我编译了2个共享lib,启用了--static libstdc++ 这两个共享lib具有相同的函数C++ C++;如果在多个共享lib和libstdc++;已启用静态链接,c++,fstream,iostream,static-linking,dlopen,C++,Fstream,Iostream,Static Linking,Dlopen,我编译了2个共享lib,启用了--static libstdc++ 这两个共享lib具有相同的函数f,它只向stdout输出一个字符串和一个整数 主程序将使用dlopen加载2个共享库,并使用dlsym调用其中的f 但是,第二个加载的共享库没有输出整数,C++流 CUT变成坏和失败< /代码> 经过讨论,我知道这是正常的。。。但是,我想把我的问题改为:libstdc++的什么实现导致了这个问题?是否存在任何共享的全局状态?我认为,如果没有共同的全球国家,这不应该是一个问题。我在Windows中通
f
,它只向stdout输出一个字符串和一个整数
主程序将使用dlopen
加载2个共享库,并使用dlsym
调用其中的f
但是,第二个加载的共享库没有输出整数,C++流<代码> CUT变成<代码>坏和失败< /代码> 经过讨论,我知道这是正常的。。。但是,我想把我的问题改为:libstdc++的什么实现导致了这个问题?是否存在任何共享的全局状态?我认为,如果没有共同的全球国家,这不应该是一个问题。我在Windows中通过静态链接到VCRuntime并使用LoadLibrary编写了类似的程序,它工作正常。那么为什么libstdc++是这样设计的呢
下面是两个共享库的代码。(它们共享相同的代码)
它们将只
cout
一个字符串和一个整数
//dll.cpp
#包括
使用名称空间std;
外部“C”无效f()
{
最后,我找到了一种在Linux(GNU扩展)中解决这个问题的方法
使用dlmopen
,它可以更好地隔离btw对象
auto-dll=dlmopen(LM\u-ID\u-NEWLM、dll\u-path、RTLD\u-LAZY);
非常感谢所有的评论
仍然欢迎解释冲突国家的详细情况
如果您不使用代码> dLCOLLUTE()/code > LIBS,作者在本文中提到“(…)为了保证工作可靠,您不能使用动态加载的C++代码,包括加载DLOpenE的代码。)您想要/需要使用<代码>静态LIBGCC静态LIBSTDC++<代码>的原因是什么?(只需确保您确实需要)@HongxuXu[…]如果我使用dlopen加载2个静态链接共享库,它们将冲突,这可能会导致问题[…]
是。“如果我使用dlopen加载2个静态链接共享库,它们将冲突”它们不会相互冲突,但它们会与主程序中的状态冲突,除非您使用RTLD_DEEPBIND
。dlmopen()的可能用法插件加载框架的作者不能信任插件作者,也不希望插件框架中任何未定义的符号被解析为插件符号。另一个用途是多次加载同一对象。不使用dlmopen(),这将需要创建共享对象文件的不同副本。使用dlmopen(),可以通过将相同的共享对象文件加载到不同的命名空间来实现。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project (TestGCC)
add_link_options(-static-libgcc -static-libstdc++)
add_library(mydll SHARED dll.cpp)
add_library(mydll2 SHARED dll.cpp)
add_executable (main main.cpp)
target_link_libraries(main dl)
hox@HOX-PC:~/repos/test-gcc/out$ ./main
hi1
eof: 0
fail: 0
bad: 0
hi
eof: 0
fail: 1
bad: 1