我认为业内应该有关于这个问题的最佳实践,所以我在这里问它。
这个问题是关于在 Linux 上使用 gcc 将共享库(.so)链接到可执行文件。但让我从 Windows 开始。
假设我正在开发 A.EXE 、 B.DLL 、 C1.DLL 。依赖是
A -> B -> C1
这意味着:A从B调用API,B通过调用C1的API实现自己。A 不直接调用 C1 中的 API。
您知道,在链接 A.EXE(使用 Visual C++)时,我只需将 B.lib(导入 lib)列为 A 的链接组件(在 makefile 中);C1 不必出现在 A 的生成文件中。所以有一天我想用 C2 替换 C1 以更好地实现 B,我不必因为 C1 的替换而更改 A 的 makefile。
这很好,因为它遵循理性的想法:makefile 只引用它直接相关的东西。有了这种便利,人们倾向于在 Windows 上编写 DLL 而不是 LIB——我认为是这样。
现在我转向 linux 上的 gcc。对于相同的依赖场景,在 A 的 makefile 中,我必须将 C1 或 C2 显式列为链接组件,如下所示:
gcc -o A a1.o a2.o -lB -lC1
如此令人沮丧,假设您有十个项目 A1、A2、... A10 调用到 B,您必须修改十个 makefile 才能从 C1 转移到 C2。
如何获得解脱?