2011-10-31 37 views
4

根据这篇文章,Google C++测试框架认为“make install”是一种不好的做法。'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的。库(debug vs release),并且你有 在整个电路板上使用相同的malloc库。“

我的问题:

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

问题标题和第一行实际上有点混乱。 'make install'中没有任何事情可以触发ODR违规行为,或者可以被认为是*糟糕的做法*。如果不同的用户试图共享二进制文件并编译具有不同编译器标志的不同位, –

+0

他们建议您应该将第三方库(也可能是其他)集成到项目的构建系统中而不是使用“make install”。 –

回答

5

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

根据实际项目,可能无法将代码与编译器标记分离,并且您将不得不忍受它,但我建议尽可能避免代码可以从配置为编译器命令行,就像你应该避免使用带有副作用的DEBUG代码一样。而当你不能,文件不同的编译器标志有影响。