linux和共享库以及不同的g++;编译程序 删除>代码,那么如果你的符号有标准的C++链接,那么DLLSIM会很棘手。一个好的实践是在外部(导出的)接口函数上使用C链接(甚至为库提供一个完整的C包装器)@alagner同意。如果你对编译的库有控制,那么不要使用C++接口使用C接口。但这就是这个答案的结果我的问题与C++命名空间无关!?!!@FrankPuck您提到了名称空间WRT符号,但Linux符号没有名称空间的概念。然而,C++命名空间的要点是如何用名字处理来处理它们。使用事实名Mangle,不同编译器的不同之处在于,C++代码中生成的符号在编译器之间不匹配。不同的厂商C++代码将永远不合作。详细信息:@Lorinczy Zsigmond合作是什么意思?我不希望它能够通过C++接口互相交谈,但只能通过C接口。我所期望的是,可以将来自不同供应商的共享库加载到单个流程中,并且它们不会相互干扰。(顺便说一句,几十年来一直在Windows上工作)@FrankPuck在你的问题中提到这一点是个非常好的主意。漏掉它,会使你的问题很容易引起误解。

linux和共享库以及不同的g++;编译程序 删除>代码,那么如果你的符号有标准的C++链接,那么DLLSIM会很棘手。一个好的实践是在外部(导出的)接口函数上使用C链接(甚至为库提供一个完整的C包装器)@alagner同意。如果你对编译的库有控制,那么不要使用C++接口使用C接口。但这就是这个答案的结果我的问题与C++命名空间无关!?!!@FrankPuck您提到了名称空间WRT符号,但Linux符号没有名称空间的概念。然而,C++命名空间的要点是如何用名字处理来处理它们。使用事实名Mangle,不同编译器的不同之处在于,C++代码中生成的符号在编译器之间不匹配。不同的厂商C++代码将永远不合作。详细信息:@Lorinczy Zsigmond合作是什么意思?我不希望它能够通过C++接口互相交谈,但只能通过C接口。我所期望的是,可以将来自不同供应商的共享库加载到单个流程中,并且它们不会相互干扰。(顺便说一句,几十年来一直在Windows上工作)@FrankPuck在你的问题中提到这一点是个非常好的主意。漏掉它,会使你的问题很容易引起误解。,c++,linux,C++,Linux,我在以下假设中是否正确: 在linux进程中,符号只有一个名称空间。只能通过符号名称查找和解析符号。当存在未知的可执行文件(客户提供的)或客户提供的共享库时,符号的源是随机的 无法确定STL/boost符号是否从正确的源解析,因为它们总是很弱,因此可能会被覆盖 在同一进程中使用(不同)libc++的多个副本(其中一些是静态的)有什么意义 我不希望分开的图书馆能够通过C++接口互相交流,而只能通过C接口。我想要的是,可以将来自不同供应商的共享库加载到单个流程中,而不会使它们相互干扰 我知道这在Wi

我在以下假设中是否正确:

  • 在linux进程中,符号只有一个名称空间。只能通过符号名称查找和解析符号。当存在未知的可执行文件(客户提供的)或客户提供的共享库时,符号的源是随机的
  • 无法确定STL/boost符号是否从正确的源解析,因为它们总是很弱,因此可能会被覆盖
  • 在同一进程中使用(不同)libc++的多个副本(其中一些是静态的)有什么意义

    我不希望分开的图书馆能够通过C++接口互相交流,而只能通过C接口。我想要的是,可以将来自不同供应商的共享库加载到单个流程中,而不会使它们相互干扰


    我知道这在Windows中已经运行了几十年

    似乎可以通过使用传递给dlopen()的以下标志加载共享库来避免这种随机性:

    • 本地
    • RTLD_DEEPBIND

      • 你的评论完全改变了你的问题:

        我不希望它能够通过C++接口互相交谈,而只能通过C接口。我所期望的是,可以将来自不同供应商的共享库加载到单个流程中,并且它们不会相互干扰。(顺便说一句,几十年来,该软件一直在Windows上工作)

        这一行为要素在很大程度上与系统无关。和Linux在设计上非常相似,因此它们在这个主题上没有添加任何额外的约束或功能。因此,如果您的技术要在Windows中工作,那么它也应该在Linux中工作,只需将
        .dll
        文件替换为
        .So
        文件即可

        Linux比Windows有更多的标准化,所以如果你觉得Linux让它更简单的话


        原始答案 问题:

        Linux进程中的符号只有一个名称空间

        对,;Linux的加载程序中没有名称空间这样的东西

        正如你可能知道的,C和C++是非常不同的语言。C++的命名空间C没有。加载库时(在Linux、Unix和Windows中),没有名称空间的概念

        C++编译器用于确保代码中由名称空间隔离的名称在作为符号放置在共享对象中时不会被编译。C编译器不这样做,也不需要这样做,因为没有名称空间


        问题:

        只能通过符号名称查找和解析符号。当存在未知的可执行文件(客户提供的)或客户提供的共享库时,符号的源是随机的

        让我们将“随机”一词替换为“不可预测”。这也是正确的

        <> C++语言没有定义标准的装饰方案,所以每个编译器都使用它自己的。C++还具有复杂的语言特性,如类、模板、命名空间和运算符重载,它们根据上下文或用法改变特定符号的含义。有关这些特性的元数据可以通过损坏(装饰)符号的名称来消除歧义。因为这些特性的名称篡改系统在编译器之间没有标准化,所以很少有链接器可以链接不同编译器生成的目标代码


        问题:

        <关于Linux上的进程是什么故事,哪个DLOpen()多个共享库,以及可执行的和/或共享的库,用不同的C++编译器编译(例如由客户或第三方提供)。 您可以脱离共享对象,但由于名称混乱,使用起来会很困难。您必须手动检查共享对象以确定确切的符号名称


        在同一进程中使用(不同)libc++的多个副本(其中一些是静态的)有什么意义


        如果你做到了这一点,那么我首先会关心内存管理。libc++负责实现
        new
        delete
        并将它们转换为来自操作系统的内存请求。如果它们有任何行为,它们可能会管理自己的内存池。如果你在一个不同的LIbC++.P/>中创建了一个对象,调用了代码>删除>代码,那么如果你的符号有标准的C++链接,那么DLLSIM会很棘手。一个好的实践是在外部(导出的)接口函数上使用C链接(甚至为库提供一个完整的C包装器)@alagner同意。如果你对编译的库有控制,那么不要使用C++接口使用C接口。但这就是这个答案的结果我的问题与C++命名空间无关!?!!@FrankPuck您提到了名称空间WRT符号,但Linux符号没有名称空间的概念。然而,C++命名空间的要点是如何用名字处理来处理它们。使用事实名Mangle,不同编译器的不同之处在于,C++代码中生成的符号在编译器之间不匹配。不同的厂商C++代码将永远不合作。详细信息:@Lorinczy Zsigmond合作是什么意思?我不希望它能够通过C++接口互相交谈,但只能通过C接口。我所期望的是,可以将来自不同供应商的共享库加载到单个流程中,并且它们不会相互干扰。(顺便说一句,几十年来一直在Windows上工作)@FrankPuck在你的问题中提到这一点是个非常好的主意。漏掉它,会使你的问题很容易引起误解。