【发布时间】:2011-10-21 05:39:00
【问题描述】:
我正在减少和隔离我对某些库的使用。我编写的许多现有程序直接使用这些库。我想要编译器(在这种情况下是 GCC 和/或 Clang)或一些工具来帮助我在我的代码库中识别这些用途。简而言之,我想在整个代码库中毒化这些库的使用,但它们将被一个库使用,并且一个库将对我的代码库中的其他模块可见。
问题:
1) 你知道可以帮助我解决这个问题的工具吗?
2) 或者您能否推荐一些策略来简化此过程?
条件和详情:
- 不能删除它们的包含。
- 由于我的代码库大小和要隔离的符号数量,搜索无效。
- 考虑到代码库的复杂性和要删除的符号数量,使用重构工具将过于乏味。
- 由于第三方库中声明的数量,不能单独弃用符号。
- 第三方库接口大多用 C 编写。
- 翻译将是 C++ 和 Objective-C++。
- 对于我的构建配置方式而言,预处理器的诡计并不优雅,它会更改太多文件。
- 不需要取消每次最后一次使用。理想情况下,它们会是,但大多数用途是令人满意的。这不是一项要求,因为要更新的内容太多。
- 在这种情况下,将它们从链接阶段移除并不是一个好的选择(在更新 #3 中有详细说明)。
- 理想情况下,此工具或策略可以在 OS X 上使用,但我也可以构建大量针对 Linux 的程序。
想到的一些策略:
到目前为止,对于这种情况,我想出的最好办法是重新声明库使用的类型,并用不推荐使用的属性来装饰它们:
typedef IHREType IHREType __attribute__((__deprecated__));
但这不会涵盖所有情况,经过几次迭代后信噪比会很高。
另一种方法是在我使用的根命名空间中重新声明这些类型:
namespace MON {
typedef t_poisoned IHREType;
}
但这会变得有点混乱。
所以我想我将从弃用的属性策略开始,但在我这样做之前,我想其他人已经解决了这个问题并且会知道更好的解决方案。
更新 #1
- K-ballo 提到了一个很好的策略(通过包含中毒)。不幸的是,在我的情况下它不起作用,我想隔离的 API 也可以在系统框架中找到,这些框架是通过我不想隔离的 API 包含的。
更新 #2
由于响应数量少而添加了 Linux。
更新 #3
> > Justin: Removing them from the link stage is not a good option in this case.
> thiton: Why not?
详细说明这一点:我喜欢此时库和项目的布局方式。有静态库和动态库的组合。更改该结构并同步依赖项非常耗时(尽管对于某些库来说,孤立的情况可能会很好地利用时间......)。链接器还解决了由于依赖关系(例如在系统库中)而我想要删除的大量符号。
我正在制定的计划
代码库中有数百个 Xcode 项目(为其他构建器/IDE 添加到该项目中)。
我将在这里关注这些更新几天,那里几天;在这个时间范围内,100% 的覆盖率不是一个现实的目标,目前也不是一个要求。由于任务的规模和代码库的当前状态,我现在想专注于按数量删除出现。按数字删除也是可取的,因为它最终会减少构建时间(构建这一切需要一段时间)。一旦减少,我将转向完全消除——至少,这是我目前的计划。在这种情况下,我有时间执行更新,但还不紧急。如果您的建议偏离此模型,我确实有灵活性。
【问题讨论】:
-
"在这种情况下,将它们从链接阶段移除并不是一个好的选择。"为什么不?我认为链接器命令行中正确放置的毒药库可以让您在这里度过没有人做内联或宏魔术的一天。如果您可以更清楚地说明您的详细信息的原因,那么回答会容易得多。截至目前,我只看到一个“非选项”声明列表,当我回答时会扩展:-)。
-
@thiton 很高兴提供详细信息:请参阅更新 #3。如果您需要更多信息,请询问 - 我试图让它远离“tl;dr”。
标签: c++ c deprecated dependency-management