c - 公开或不公开 API

标签 c cross-platform

我在使用的一个可移植 C 库中遇到了当前的困境。我有两个高级库(比如 libA 和 libB)。它们提供非常不同的 API,并且取决于用户配置选项。我反对将它们合并在一起,因为这意味着将任何后来的 libC、libD 与 libA 合并。所以我试图保持这种清晰的分离。这也意味着,如果应用程序员只需要 libA 而不需要 libB,则他们可以拥有一个轻量级的应用程序。

问题是 libB 使用了 libA 的符号。但是,它使用了我不想公开的来自 libA 的低级 API。有没有一种方法可以防止暴露这个低级 API,同时避免代码重复?

我正在使用 gcc visibility flags在 UNIX 和 Windows 上的等效编译过程中。很明显,这些符号是可见的:

$ nm -D bin/libA.so
[...]
00000000000045e6 T low_level_func1
00000000000043d8 T low_level_func2

我可以创建一个静态低级库吗?在构建过程中,我会将 libA 和 libB 链接到它并且从不安装或分发这个 low-level 库? 这是可移植的吗?我需要找到一个可移植的解决方案(Linux、Windows、FreeBSD、MacOSX...)

谢谢

最佳答案

我不会尝试在这里进行黑客攻击和解决方法,这是一个设计问题,解决方法最终会回复您。您可能想查看适配器设计模式:http://en.wikipedia.org/wiki/Adapter_pattern

关于c - 公开或不公开 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13007392/

相关文章:

c - 写入内核模块中的文件 - 有 fd​​,有指针来写入 sys 调用

c - 使用 fseek 保留空间安全吗?

android - UIBezierPath 到 NSData 到服务器到 Android

C++ 跨平台后台任务

c - 为什么 printf(i) 在此程序中给出 0 作为输出?

c++ - 套接字编程 C/C++ - recv 函数在服务器中挂起

c++ - GetPath() 是否返回三次或二次贝塞尔曲线控制点?

c++ - 什么是形式参数?

android - 基于 QML 模型的组件在 android 上具有未定义的 modelData

c++ - Cinder:如何获取指向已生成但从未在屏幕上显示的数据\帧的指针?