#1a1f6YB1 (Soft_Job) [ptt.cc] Fw: [問卦] C++到底難學在哪?
: 推 wizmelo: 我覺得C++一開始CMake建置環境就會勸退很多人 然後報錯 03/09 09:22
: → wizmelo: 的異常很難看懂 導入別的包使用function 也寫的很難讓人 03/09 09:22
: → wizmelo: 看懂 如果以一個沒使用過的人來說 03/09 09:22
: 推 ko27tye: 沒跨平台需求老實說make夠用了 03/09 13:19
: 推 wulouise: cmake比make簡單,但是要是不懂make有時候出問題,難查 03/10 22:57
: → superpandal: go的很不統一 import個包要全網址 03/13 17:36
: → superpandal: 原生makefile比cmake好多了 簡潔有力 03/13 17:38
: → superpandal: 而且現在一堆這樣的都很肥大cmake meson都是 03/13 17:39
: → superpandal: 裝一裝一堆沒用到的語言都裝上去 03/13 17:40
: → superpandal: 當然都可以用shell來產makefile就像 03/13 17:49
: → superpandal: cmake configure那種亂寫的除外 03/13 17:50
我非常同意CMake的報錯信息難看懂,所以我都改用meson了。
先不戰CMake和meson
Makefile不是不可以跨平臺,如FFmpeg。我也不是完全反對Makefile,
kernel, buildroot(openwrt),最上層用用Makefile還行。不過後者我改
OpenEmbedded了。
我們先不講跨平臺,C++一個header編譯到懷疑人生的久,不用PCH處理早晚吐血。
你試看看Makefile寫個recipe來處理。
很多人Makeilfe的link規範寫不對盤,bsd linker, gold linker, lld,最老的bsd隨便你
寫順序都能link上。後面要速度換了一個。
結果一個shared library A依賴shared library B。你構建target的時候,B寫在A的前面了,
馬上gold linker報錯。
static library不是當作object輸入的,當作一個library,結果死活有一個symbol unresolve。
還有很多肚爛的的先把objects全部都archive,然後再製造出executable或者shared library。
突然提示symbol unresolve,幾百個objects我要在長長的log中找出來哪個symbol。
為什麼compiling的時候不提示?因為header file中有這個declaration,結果symbol的
definition完全不同。
又為什麼會這樣呢?因為Makefile的cflags, cxx flags和ld flags這些傳遞都是沒有保障的,
可能莫名奇妙的被另外一個file給override了。後面的target全部死光光。
meson雖然沒有明顯區分local variable和global的,但是這些flags是可以一個target一個
設定的。CMake有個非常複雜的naming scope機制,我基本上理解到放棄。
另外就是所謂的options功能了,每次都重新編譯大項目沒幾個人受得了。而Makefile的
string解析真是爛,要call shell來又可能會造成env和本地變數衝突,語法可能有不正確的
解析。
以上都是工作中的碎碎念。實際的場景比這個更複雜