C ++查找并删除对很少使用的库的引用

时间:2013-05-21 17:52:05

标签: gcc gnu ld

我正在修改大量遗留C ++代码,这些代码对旧的commoncpp库有一些依赖性。我们想用更现代的东西替换commoncpp(例如Boost)。

首先,我需要找到所有使用commoncpp提供的函数和方法的地方。明显的蛮力方法需要花费太多时间(特别是对于像我这样认为计算机应该做繁琐工作的“懒惰”程序员: - )。

我正在寻找有关如何加快这一过程的想法。

如果ld有一个标记表示“继续查找外部引用并吐出任何缺少的引用”,则可能会执行所需的所有操作。

我们的代码遍布许多目录,使用分层递归Makefiles,如果这对建议的解决方案产生影响。

环境是带有Gnu编译器链的FreeBSD。

我也用C标记了这个,因为大多数可以解决C类问题的解决方案也应该为C ++解决它。

(猜你不能格式化评论)

在我的构建中使用--cxref,然后使用此管道:

% egrep 'ccgnu2|ccext2' output.txt | sort | uniq

给我这个:

on-virtual thunk to ost::ttystream::~ttystream() ../../lib/libccext2.so
non-virtual thunk to ost::unixstream::~unixstream() ../../lib/libccext2.so
ost::CRC16Digest::getSize() ../../lib/libccext2.so
ost::CRC16Digest::initDigest() ../../lib/libccext2.so
ost::CRC16Digest::~CRC16Digest() ../../lib/libccext2.so
ost::CRC32Digest::getSize() ../../lib/libccext2.so

我想知道我是否可以通过以上方式获得我需要的东西。

1 个答案:

答案 0 :(得分:2)

来自the ld man page

  

- 警告 - 未解决的符号

     
    

如果链接器要报告未解析的符号(请参阅选项--unresolved-symbols),它将会报告     通常会产生错误。此选项使其生成警告     代替。

  

您需要做的就是编译而不链接实际的库。

在我的机器上:

~/workspace/jos$ make 2>&1 | grep reference
lib/spawn.c:129: warning: undefined reference to `copy_shared_pages'
user/primes.c:25: warning: undefined reference to `fork'
.
.
.