我正在减少和隔离我对某些库的使用.我编写的许多现有程序直接使用这些库.我想要编译器(在这种情况下是GCC和/或Clang)或一些工具来帮助我识别我的代码库中的这些用法.简而言之,我想在代码库中毒害这些库的使用,除了它们将由一个库使用,并且我的代码库中的其他模块可以看到一个库.
问题:
1)你知道可以帮助我的工具吗?
2)或者你能推荐一些策略来简化这个过程吗?
条件和细节:
>删除他们的包含不是一种选择.
>由于我的代码库大小和我要隔离的符号数,搜索无效.
>鉴于代码库的复杂性和要删除的符号数量,使用重构工具将太繁琐.
>由于第三方库中的声明数量,不能单独弃用符号.
>第三方库接口主要用C语言编写.
>翻译将是C和Objective-C.
>对于我的构建配置方式,预处理器技巧并不优雅,并且会改变太多文件.
>每次最后一次使用都不需要消除.理想情况下,它们会是,但大多数用途都令人满意.这不是一个要求,因为有太多的更新.
>在这种情况下,从链接阶段删除它们不是一个好的选择(在Update#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%的覆盖率不是这个时间范围的现实目标,也不是目前的要求.由于任务的大小和代码库的当前状态,我想重点关注此时按编号删除出现的情况.按编号删除也是优选的,因为它最终将导致更少的时间构建(需要一段时间来构建这一切).一旦减少,我将转向彻底消除 – 至少,这是我目前的计划.在这种情况下,我有时间执行更新,但它还不是很紧急.如果您的建议偏离此模型,我确实具有灵活性.