'make install'被认为是有害的吗?

Is 'make install' considered harmful?

本文关键字:make install 认为是      更新时间:2023-10-16

根据这篇文章,Google c++测试框架认为"make install"是一个不好的做法。

http://groups.google.com/group/googletestframework/browse_thread/thread/668eff1cebf5309d

这样做的原因是该库违反了"一个定义规则"。

http://en.wikipedia.org/wiki/One_Definition_Rule

在线程的某个地方,它说:"如果你传递不同的-DGTEST_HAS_FOO=1标志给不同的翻译单元,你将违反ODR。或者有时人们用-D选择使用哪个malloc库(调试还是发布),您有使用相同的malloc库。"

我的问题:

  1. 这个项目到底做错了什么?
  2. 我们能从中学到什么?我们如何编写更具防御性的代码来防止违反ODR?

这个问题的直接答案是:不要编写依赖于编译器参数的代码。在这种情况下,整个讨论源于这样一个事实,即代码根据编译器标志(很可能是通过#ifdef或其他预处理器指令)而不同。这反过来意味着,虽然代码库是相同的,但通过改变编译器标志,处理的代码将是不同的,并且用一组标志编译的二进制文件将不兼容用另一组标志编译的二进制文件。

根据实际项目,可能不可能将代码与编译器标志解耦,并且您将不得不忍受它,但我建议尽可能避免在可以从编译器命令行配置的代码中使用,就像您应该避免只调试具有副作用的代码一样。如果不能,记录不同编译器标志的效果。