gpt4 book ai didi

c++ - 从多个 C++ 和 C 目标文件生成单个 .so

转载 作者:行者123 更新时间:2023-11-28 07:35:04 28 4
gpt4 key购买 nike

假设我有一个 C++ 库代码,其中一些定义用 extern "C"{ ... } 包装。

我还有一个使用该 C++ 库的 C 库代码。

我想做的是创建一个 .so 文件,这样只需调用一次 dlopen 就足以开始使用这个库。

这是我现在所做的:我首先使用 -shared -rdynamic -fPIC 将我的 C++ 库编译为 .so 文件。然后我将我的 C 库编译为具有相同参数的 .so 文件。之后,我必须在加载 C 库之前使用 dload 加载 C++ 库。否则加载失败并出现 undefined symbol 错误。

我想做的是将这两个库编译成一个 .so 文件,这样只需调用一次 dload 就足以使用它。

我该怎么做?

提前致谢。

编辑:编译为 .o 文件然后合并对我不起作用。这是我的做法:

  • 我使用 -fPIC 参数将每个文件编译为目标文件
  • 我用 clang [目标文件列表] -shared -rdynamic -fPIC -o libmylib.so 链接它们
  • 当我尝试加载时,出现undefined symbol: __gxx_personality_v0 错误。

EDIT2:啊,我忘了将它链接到 libstdc++,它现在可以工作了。谢谢。

最佳答案

  1. 最简单的方法是将它们组合成一个.so 文件,方法是组合所有目标文件,或者构建两个静态.a 库,然后将它们链接到一个单一共享库。
  2. 如果您真的想保留两个.so 文件,请将第一个库链接到第二个库,就像处理可执行文件一样。例如。如果libfoo依赖于libbar,用-lbar编译libfoo。您必须在默认库路径或 LD_LIBRARY_PATH 环境变量中包含依赖库。

关于c++ - 从多个 C++ 和 C 目标文件生成单个 .so,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16912185/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com