如何将一个项目链接到同一个 C 静态库的两个不同版本?

2023-12-02

我正在开发一个复杂的 C 生态系统,其中不同的包/库由不同的人开发。

我想创建一个名为foobar。这个项目uses两个图书馆,一个图书馆foo和图书馆bar.

很遗憾,bar不需要相同的版本foo需要。两者都使用say所以有冲突。

如果所有包都在带有子模块的 Git 上,则foobar递归克隆时无法构建项目,因为两个say函数存在于不同的翻译单元中。所以submodule策略不起作用。

我的问题是:如何管理one使用的项目two不同版本的same静态库(*.a)?

结构

          foobar
            |
       .----'----.           <---- (require)
       v         v
      foo       bar
(v1.0) |         | (v2.0)
       '-> say <-' 

项目 foobar 需要该库foo和图书馆bar,这两个库都使用say包裹:foo需要版本 1 和bar需要版本 2。

Packages

say

// say.h
void say(char *);

foo

// foo.c
#include "say.h"

void foo(void) {
    say("I am foo");
}

bar

// bar.c
#include "say.h"

void bar(void) {
    say("I am bar");
}

foobar

// main.c
#include <stdlib.h>
#include "foo"
#include "bar"

int main() {
    foo();
    bar();
    return EXIT_SUCCESS;
}

链接器通常具有执行部分链接的模式,该模式解析当前可以解析的引用并生成准备进一步链接的对象模块,而不是完成的可执行文件。

例如,GCC 链接器ld has a -r允许这样做的开关。使用此开关以及可能的其他开关,您可以链接foo.o仅需一个库即可制作foo.partial.o并单独链接bar.o与另一个图书馆一起制作bar.partial.o。然后你可以链接foo.partial.o and bar.partial.o彼此、主程序以及所需的任何其他库和对象模块。

这适用于静态库,其中每个库的代码都包含在生成的可执行文件或目标文件中,并且对其符号的引用已完全解析。对于共享动态库,可能会出现问题,因为动态库需要在运行时解析引用,并且链接器和可执行文件格式可能支持也可能不支持区分一个库的不同版本中的同名符号的能力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将一个项目链接到同一个 C 静态库的两个不同版本? 的相关文章

随机推荐