【发布时间】:2021-12-21 00:39:35
【问题描述】:
我有两个静态库(比如 A 和 B),它们都通过直接独立地包含源文件来引用相同的第三方库(比如 C)。 C 非常简单,只有一个 .h 和 .c 文件。可执行文件 D 与 A 和 B 链接。
假设 C 中有一个函数 fn。当可执行文件 D 解析函数名称:fn 时,它会在 A 或 B 中选择任意 fn 实现。
我的问题是如何确保 A 中的代码引用 A 的 C 实现而 B 引用 B 的 C 实现?
由于 C 是第三方库,所以我不会修改 C 的代码。因此,重命名任何一个函数都不起作用。我曾经考虑过使用 C++ 的命名空间来包装 C 的代码,如下所示
namespace WRAP
{
#include "moudule_c_source_file.c"
}
但是,由于 module_c_souce_file.c 包含 module_c_source_file.h,其中包含 extern "C" 声明。这会导致生成的符号对象文件不包含命名空间信息。这样可执行 D 仍然链接任意函数实现。
在不接触第三方库代码的情况下解决我上面提到的问题有什么想法吗?
【问题讨论】:
-
您可以使用一堆
#defines 来有效地重命名您的C 库中的外部名称。 -
由于“一个定义规则”,使用哪个库并不重要。否则你的程序会调用未定义的行为
-
这些是静态库还是动态库?在哪个操作系统上?
-
@AlanBirtles A 和 B 是静态库,C 实际上是一个 .h 和一个 .c 文件,直接添加到 A 和 B 中。操作系统:Windows