'make install'被认为有害吗?

Edd*_*onk 4 c++ googletest

根据这篇文章,谷歌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?

Dav*_*eas 5

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

根据实际项目,可能无法将代码与编译器标志分离,您将不得不忍受它,但我建议尽可能避免使用编译器命令行配置的代码,同样的方式,你应该避免DEBUG只有副作用的代码.如果不能,请记录不同编译器标志的效果.