如何快速找到另一个对象块需要在 link 时间出现的对象文件?

How to quickly find the object files another object tile needs to be present at link time?

我已经编译了wget的源码,这里是ftp服务器https://ftp.gnu.org/gnu/wget/到link我自己的程序到我编译项目后得到的目标文件之一.但是所需文件上的 运行 nm -u(具体来说 src/http.o)给了我一大堆需要在 link 时解析的名称。

问题 #1

是否有工具可以找到 linker 解析所有符号所需的其他目标文件?手动测试每个可能的目标文件组合似乎都不合理。

问题 #2

当我尝试 link 我的程序使用从编译项目获得的每个可能的目标文件时,我遇到了以下错误 - multiple definition。这是否意味着通常我需要 select 我只需要编译一些项目然后用它们构建我的可执行文件后得到的目标文件的一个有意义的子集?

Is there a tool to find which other object files are needed to be present for linker to resolve all the symbols?

没有。构建这样一个工具并不困难(你想在依赖图中找到连接的组件),但问题并不常见。

Manually testing every possible combination of object files does not even seem reasonable.

看起来 wget 包含大约 100 个源文件。使用所有可能的排列,你只需要尝试 link 100! 次,这确实是有点太多了。

正如@kaylum 评论的那样,开发人员并不打算 wget 作为一个可重用的库,因此即使您尝试了所有可能的组合,也不能保证有解决方案。

另请注意,linking 在 wget 源代码中会对您的最终程序施加许可限制(您必须在 GPLv3 下发布它)。

When I try to link my program with every possible object file obtained from compiling the project I meet the following error - multiple definition.

预期:你自己的程序和wget/src/main.c都定义了main函数。

Does it imply that in general I need to select only a meaningful subset of the object files that I get after compiling some project and then building my executable with them?

是的。而且一般来说甚至不能保证满足您要求的子集存在。