3

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

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

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

如果ld有一个标志,上面写着“继续寻找外部参考并吐出任何缺失的参考”,这可能会做所有需要的事情。

我们的代码分布在许多目录中,带有分层、递归的 Makefile,如果这对提议的解决方案有影响的话。

环境是带有 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

我想知道我是否可以对上述有用的东西来获得我需要的东西。

4

1 回答 1

2

从手册ld

--warn-unresolved-symbols

如果链接器要报告未解析的符号(请参阅选项 --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'
.
.
.
于 2013-05-21T18:22:54.717 回答