“make-install”被认为是有害的吗? 根据此帖子,谷歌C++测试框架考虑了make安装的一个坏的实践。

“make-install”被认为是有害的吗? 根据此帖子,谷歌C++测试框架考虑了make安装的一个坏的实践。,c++,googletest,C++,Googletest,原因是此库违反了“一个定义”规则 在线程的某个地方,它说:如果您将不同的-DGTEST_HAS_FOO=1标志传递给不同的翻译单元,那么您将违反ODR。或者有时人们使用-D 要选择使用debug vs release的malloc库,您必须 全面使用相同的malloc库 我的问题是: 这个项目到底做错了什么? 我们能从中学到什么?我们如何编写更具防御性的代码来防止违反ODR? 这个问题的直接答案是:不要编写依赖于编译器参数的代码。在本例中,整个讨论源于这样一个事实,即代码根据编译器标志而不同,很

原因是此库违反了“一个定义”规则

在线程的某个地方,它说:如果您将不同的-DGTEST_HAS_FOO=1标志传递给不同的翻译单元,那么您将违反ODR。或者有时人们使用-D 要选择使用debug vs release的malloc库,您必须 全面使用相同的malloc库

我的问题是:

这个项目到底做错了什么? 我们能从中学到什么?我们如何编写更具防御性的代码来防止违反ODR?
这个问题的直接答案是:不要编写依赖于编译器参数的代码。在本例中,整个讨论源于这样一个事实,即代码根据编译器标志而不同,很可能是通过ifdef或其他预处理器指令实现的。这反过来意味着,虽然代码库是相同的,但通过更改编译器标志,处理的代码将不同,并且使用一组标志编译的二进制文件将与使用另一组标志编译的二进制文件不兼容


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

问题标题和第一行实际上有点混乱。makeinstall本身并没有任何东西可以触发ODR冲突,或者被认为是不好的做法。如果不同的用户尝试共享二进制文件并使用不同的编译器标记编译不同的位,那么这样做可能会产生一个潜在的不良副作用。他们建议您应该将此第三方库以及其他库集成到项目的构建系统中,而不是使用“make install”。