【问题标题】:Make multiple jobs generates incompatible .so使多个作业生成不兼容的.so
【发布时间】:2013-09-12 12:38:49
【问题描述】:

对于何时可以安全地要求 make 处理多项工作是否有任何快速指南?

我问是因为在过去,它通常对我来说似乎工作得很好,但最近它一直在引起麻烦。

我做了一个“make -j8”(使用八个作业来加快构建速度)并不断得到:

“.so 文件格式无法识别”在正在生成的共享库之一上。即使在清理共享库之后也是如此(make clean 成功确实删除了它,但是一旦我也做了不必要的手动删除它的步骤)并重新开始。

看到问题后,我现在对使用多个工作持怀疑态度。有没有办法提前判断多个作业是否可以与 make 一起使用?

【问题讨论】:

  • 只要依赖项正确在 Makefile 中提供,它应该可以工作。
  • 就像 Jarod 所说,它应该可以工作。但是如果你“忘记”了一些作为构建一部分的头文件,所以一些代码是用新版本的头文件编译的,而一些代码是用旧版本编译的,那么你可能会遇到这种问题。跨度>

标签: c++ gcc makefile shared-libraries gnu


【解决方案1】:

这一切都取决于您的依赖项在 Makefile 中的布局情况。您必须非常小心并指定每个依赖项,而不仅仅是依赖行顺序和巧合。

我遇到过make -j2 的输出工作得很好但make -j4 没有输出的情况,因为一个项目在它应该被编译之前就被编译了,但我没有足够小心地指定它。同样,我已经让make -j4 似乎可以工作,只是发现某些部分正在使用陈旧的代码进行编译,这意味着最终产品将与我预期的不同。在我发现允许我再次安全使用make -j4 的依赖问题之前,我必须确保在任何构建之前make clean

让我回答你的每一个问题:

  • 是否有任何快速指南可以说明何时可以安全地要求 make to do 它的工作与多项工作有关?

不在我的书中。如果您的依赖项完全正确,那么您就可以开始了。否则,请小心。

  • 有没有办法提前判断多个作业是否可以 与make一起使用吗?

我认为答案与上一项相同。我通常认为它会起作用,直到我知道它不起作用,然后我试图找出问题所在。然而,这可能不是一种安全的工作方式。如果您注意到意外结果,请使用make clean,然后使用make,而不使用多个作业,看看是否能解决问题。如果是这样,您可以合理地假设您的 Makefile 的依赖项不正确。

您还有一个关于.so file format not recognized 问题的隐含问题。这听起来像是同一个问题。具体来说,可能是 .so 是使用错误的依赖项构建的,或者在找到或构建正确的依赖项之前就引入了错误的 .so,或者在调用 .so 时它是一个不完整的状态。

【讨论】:

  • 也有可能,基于这个错误,你有两个不同的配方试图同时更新目标(并因此破坏它)。如果两个不同的 makefile 试图构建相同的目标,这对于递归 make 环境来说是一个特别严重的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多