C++依赖生成没有自动化的理论原因是什么?

Met*_*ome 18 c++ build

C++ Buildsystem,具有预先编译依赖项的能力

Java有Maven的是一起工作非常愉快,只是指定已经被编译,并沉积到依赖性内行标准目录,也就是说,相对于具有多个位置的经常使用的方式依赖的位置是标准化(给我一个像任何人都记得C/C++依赖项的特定deps的默认安装目录一样.

对于每个开发人员而言,通常都需要查找,阅读,熟悉配置选项/构建,最后编译每个依赖项以简单地构建项目,这对于每个开发人员来说都是非常缺乏效果的.

这个没有实施的理论原因是什么?

为什么用类似maven的声明格式提供以下选项的包很困难?

version
platform (windows, linux)
src/dev/bin
shared/static
equivalent set of Boost ABI options when applicable
Run Code Online (Sandbox Code Playgroud)

必须手动访问网站并在2013年搜索最古老的主要编程语言的依赖关系是荒谬的.

Jos*_*ley 21

没有任何理论上的原因.有许多实际原因.在C++世界中有太多不同的处理方式来轻松地在依赖系统上进行标准化:

  • 实现差异 - C++是一种复杂的语言,不同的实现在历史上有多么不同(它们如何正确处理各种中等到高级的C++代码).因此无法保证可以在特定实现中构建库.
  • 平台差异 - 某些平台可能不支持异常.标准库有不同的实现,各有利弊.与Java的标准化库不同,Windows和POSIX API可能完全不同.该文件系统是不连标准C++的一部分.
  • 编译差异 - 静态还是共享?调试或生产构建?是否启用可选依赖项?与具有非常稳定的字节码的Java不同,C++缺少标准ABI意味着代码可能无法正确链接,即使由同一编译器为同一平台构建也是如此.
  • 构建系统差异 - Makefile?(如果是这样,GNU Make,还是其他什么?)Autotools?CMake的?Visual Studio项目文件?别的什么?
  • 历史问题 - 由于C和C++的时代,像zlib这样的流行库早于像Maven这样的构建系统.为什么zlib会在它正在运行的时候切换到某个假设的C++构建系统?如果一个更高级别的库依赖于像zlib这样的库,那么它如何能够切换到某个假想的构建系统?

另外两个因素使事情变得复杂:

  • 在Linux中,发行版打包系统确实提供了开发库头文件二进制文件的标准化存储库,具有(通常)标准化的ABI以及指定项目构建依赖关系的简便方法.这些(特定于平台的)解决方案的存在减少了跨平台解决方案的推动力.
  • 由于所有这些复杂因素和预先存在的方法,任何建立标准构建系统的尝试都将遇到XKCD "标准"中描述的问题:
    情况:有14个竞争标准.
    "14?很聪明!我们需要制定一个覆盖每个人用例的通用标准."
    很快:有15个竞争标准.

所有这些说:

对未来有一些希望.例如,CMake似乎正在逐步取代其他构建系统.一些Boost开发人员已经启动了Ryppl,试图做你所描述的.