#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和本地变量冲突,语法可能有不正确的
解析。
以上都是工作中的碎碎念。实际的场景比这个更复杂