看了好多回答,仍是以为有更本质的缘由的,根源仍是在C++这个语言特性上为何C++没有Python之类语言这样活跃的生态?我以为根本缘由在于C++没有解决好一个问题:菱形依赖什么叫菱形依赖呢?就是说A依赖B,A也依赖C,可是B和C同时依赖D,而且咱们限定D并非STL这样的标准库,BCD都是开源库。为了限定到C++,咱们这里BCD都是C++库,采用源码的方式发布。这种状况在生态活跃的语言中则是很是常见的。在C++当中会怎样呢?B和C中至少一个将D的源码合并到了本身的源码里面,放到thirdparty之类的目录里面。A将两份源代码加本身的一块儿放到thirdparty里面,编译,符号冲突,爆炸。B和C在install说明中提到,必须把依赖放到某个地方,而后修改Makefile/CMAKE/Bazel配置,将D的源码目录加进来。结果B和C编译出来的.a里面仍是带着D的所有符号,A尝试二进制连接,符号冲突,爆炸。B和C在install说明中提到,须要将D的依赖放在某个地方,先编译成.a,设置好参数直接连接.a。可是B和C要求的D的编译参数不同,连接不到一块儿,爆炸。把全部的依赖都一个一个放在独立的位置上,设置好include目录,每一个都用本身的Makefile独自编译成.a,编译参数用同一套,最后再一个一个指定起来连接到一块儿——人工成本爆炸。A但愿B和C经过动态连接方式链接,方便升级。动态连接库里面连接了D的符号,加载起来符号冲突,爆炸。B和C一个动态连接了D,一个静态连接了D,仍是符号冲突,爆炸。D把本身改为了header only的库,终于不须要单独编译了。B和C在引用D的时候设置的宏不同,致使编译出的弱符号不兼容,连接完运行崩溃,爆炸。以上种种,最后对于C++库的做者来讲,就变成了这样一个结果:若是我要提供一个好用、好编译、不给我每天找事情的库,那么我不能引用其它的开源库没有比这更矛盾的事情了,要造轮子,第一件事情是不能用别人的轮子。可是若是你要正经开发一个系统,你能保证本身不会有一天须要把这个代码重构成一个通用的库吗?那你就得从第一天开始避免用第三方开源库……在Linux上面惟一有点生态的意思的作法,是引用yum/apt源里面的xxx-dev这样的库,这些库经过pkgconfig的方式组织,并且经过包管理系统保证你们下载到的都是相同且兼容并且编译好了的二进制库,引用起来很方便。可是,只有把接口限定到纯C才能发布确保二进制兼容的库,那折腾了半天,就算内部是C++开发的,一到库的边界上还得转成纯C,也就失去了C++语言的优点了。ide
做者:灵剑
连接:https://www.zhihu.com/question/375368576/answer/1059898195
来源:知乎接口