Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如果在多个共享lib和libstdc++;已启用静态链接_C++_Fstream_Iostream_Static Linking_Dlopen - Fatal编程技术网

C++ C++;如果在多个共享lib和libstdc++;已启用静态链接

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中通

我编译了2个共享lib,启用了--static libstdc++

这两个共享lib具有相同的函数
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