看了好多回答,仍是以爲有更本質的緣由的,根源仍是在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
來源:知乎接口