'make install'被认为是有害的吗?
Is 'make install' considered harmful?
根据这篇文章,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库。"
我的问题:
- 这个项目到底做错了什么?
- 我们能从中学到什么?我们如何编写更具防御性的代码来防止违反ODR?
这个问题的直接答案是:不要编写依赖于编译器参数的代码。在这种情况下,整个讨论源于这样一个事实,即代码根据编译器标志(很可能是通过#ifdef
或其他预处理器指令)而不同。这反过来意味着,虽然代码库是相同的,但通过改变编译器标志,处理的代码将是不同的,并且用一组标志编译的二进制文件将不兼容用另一组标志编译的二进制文件。
根据实际项目,可能不可能将代码与编译器标志解耦,并且您将不得不忍受它,但我建议尽可能避免在可以从编译器命令行配置的代码中使用,就像您应该避免只调试具有副作用的代码一样。如果不能,记录不同编译器标志的效果。
相关文章:
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- CMake "--target install"无需"--build"命令行
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- make 命令如何避免重新编译未更改的源文件?
- 如何将C++11旗帜传递给"npm install"?
- MAKE:找不到包含的用户定义的头文件?
- 'make check' GLIBC 运行时的链接问题
- Qt5 [make -snap] 无法正确编译:进程"/usr/bin/snap"代码 1 退出
- Install libpcap
- mingw32-make 使用"MinGW Makefiles"生成器跟踪 CMAKE 无法将可执行文件链接到对象库
- make 命令创建 .file,但不创建应用程序文件
- 如何摆脱导入的 make 项目中的 Eclipse 索引器"Type std::... could not be resolved"错误
- 你如何修复'cmake ..&&&使安装' "No rule to make target install" ?
- 在 Eclipse CDT 中执行 sudo make install
- CMake "make install"或在窗口中包含库
- RPath无法使用从CMake生成的Make Install
- "No rule to make target 'install'"......但是Makefile存在
- KDE 应用程序在'make install'后不安装
- 有符号和无符号整数表达式之间的比较在make install时发出警告
- 'make install'被认为是有害的吗?