【问题标题】:How to link two .so in C/C++如何在 C/C++ 中链接两个 .so
【发布时间】:2023-03-15 13:46:01
【问题描述】:

我想将两个 .so 相互链接。 场景是: 1) 两个 .so 中都定义了同名的方法(例如 void fun() ) 2)假设我们从第一个.so调用这个方法,那么调用应该转到第二个.so中定义的方法

这怎么可能?

// Module 2

#include <stdio.h>
void fun();

void fun()
{
   printf(""from 2nd .so\n"");
}


// Module 1 

#include <stdio.h>
void fun();

void fun()
{
   printf("from 1st .so\n");
}

int main()
{
  fun();
  return 0;
}

【问题讨论】:

  • In c 是不可能的。在 C++ 中,您可以覆盖函数,但您必须传递不同的参数。
  • 您的.so 中有一个main() 入口点?那应该如何工作?

标签: c++ c linker static-linking dynamic-linking


【解决方案1】:

如果你真的想要这个,我想你可以处理这个 延迟加载库。

这是一个unix的例子: Delay-Load equivalent in unix based systems

【讨论】:

    【解决方案2】:

    您将与名称发生冲突,这是您在 c++ 中使用命名空间的原因之一,而且您还使用 c++ 标签标记了您的问题,所以我假设您可以使用这种语言进行编译。共享库的延迟加载也是某种解决方案,但您必须手动检查符号 + 对 dlopen 打开的库的依赖,ldd 命令(或 Windows 上的等效命令)不会显示。您还可以查看此处提出的一些技巧:

    linking two shared libraries with some of the same symbols

    我希望您问这个问题只是因为您使用的是遗留代码,而您发布的代码只是示例。你不应该故意做这样的事情。

    【讨论】:

      【解决方案3】:

      不可能,在给出的示例中。当第二个 .so 被构建时,对fun() 的调用已经解决。您无法重新解决呼叫。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多