本科学过一点 C++,但也仅限于基本语法,class 虚函数之类的(印象中隐约记得)。后来就完全没有动过了。但是刚刚看了 v2 的一篇帖子,顿时引起了兴趣。
C++ 有啥好用的包管理吗?我之前学过一点 Rust 就是因为 C++ 似乎(?)没有好用的包管理(本科可能只是入门太浅没讲到,或许是我忘记了?)
C++ 每个版本变化都很大吗?应该怎么选择版本入手?
跨平台写起来痛苦吗?(看起来 Golang 跨平台做的不错)
1
yaott2020 OP 大佬们轻喷,我真的不太懂 C++,有啥问题请指教。。。
|
2
mainjzb 2023-09-28 13:21:27 +08:00
C++真的没有包管理。各大三方包管理基本都是有其中一些库。。。
比如我用 vcpkg ,前几天想用 QHotkey 就没有。没办法只能自己编译。编译了好几次才链接成功。这类问题已经是 C++的硬伤了。你必须花费很多时间在无关编码的问题上。 目前主流 14 17 大部分版本发布后,3 年后才会慢慢扩散到项目上。qt 目前是 17 C++很多系统有关接口。。。事实上是 go 都有人给你擦屁股了。C++大概率你要自己擦屁股。或者找一个已经给你擦屁股了的库,又要经历一些自己编译链接失败的问题。 能支持 cmake 的库已经是谢天谢地了。。。 我也是菜鸡。 |
3
ysc3839 2023-09-28 13:24:05 +08:00 via Android
2. 有大有小,像 C++14 C++17 就不太大,C++20 就很大
3. 个人感觉不痛苦,C++20 的 STL 用起来已经挺方便的了,C++11 配合 boost 也没啥问题。 |
4
ysc3839 2023-09-28 13:25:22 +08:00 via Android
@mainjzb Qt 只是默认旧版本吧,不是不支持旧版本,之前我用 C++20 配合第三方的 Qt 协程库,没有什么问题
|
5
hhjuteman 2023-09-28 13:26:13 +08:00
1. vcpkg or conan, 就算有包管理器很多项目也是 compile from source ,好控制参数,有问题随时改,或者是自己套 conan 或者 vcpkg 的服务自建。或者用 cmake ,脚本小源码模块写好参数自己编。我现在公司的项目就是 cmake + python 管理的流程,说白了就是 cmake+脚本。方法很多,不统一,属于是八仙过海各显神通了。
2. 版本向下兼容,一般一个标准出来 5 年左右基本所有主流的编译器会完全支持该标准,这个时候我就推荐你完全掌握这个标准了。比如 2022 年要掌握 c++17 ,2025 掌握 c++ 20 。版本变化有时很大,有时很小,需要自己关注。 3. 跨平台不碰图形很好跨,涉及到图形相关就很难受。即使是 QT 这种,到了 Linux 上面也得考虑 x11 ,Wayland 。Mac 端要考虑 QT 版本和 Mac 版本的兼容性。3D 图形可以用 OpenGL 和 Vulkan ,但是还是一样涉及到窗口管理器等蛋疼的内容。 没有 GUI 的也不需要跨,只做 Unix 兼容,windows 想跑开 docker 或者 wsl 跑。很多库都是跨平台的,如果整个项目引用的都是跨平台的库,标准库等等,那么工作就比较好做。 |
6
mainjzb 2023-09-28 13:28:58 +08:00
对 C++而言,cmake 是目前唯一解,目前的包管理不如 cmake 。cmake 是主流
目前有一些人在用 zig 的包管理编译 c 的库,希望 zig 能解决包管理的问题吧。。。 |
7
nenseso 2023-09-28 14:19:26 +08:00
C++跨平台不痛苦,算是比较好的选择,其他很多新的语言支持都没有它好,但是有时候有些符号冲突问题也很难啃,算是难度和趣味并存吧
|
8
NEO17 2023-09-28 14:30:56 +08:00
1.没啥好用的包管理,vcpkg 凑合用,有时拉取公网资源很麻烦,毕竟 build 环境可能会多种多样,最好还是源码管理,cmake 统一构建。
2.大致是 C++98,C++11, C++14, C++17,C++20... C++98 是第一个 C++ ISO ,但 C++98 之前已经大量使用;从 C++11 开始进入 Modern C++; C++14 是对 C++11 的完善,C++17 计划是大更新,实际都是很多小更新; C++20 可能是新的 C++11 。 3. C++ 跨平台痛不痛苦和代码库中老 C++ 代码多不多有关,往往是依赖一堆老的 C++ 代码、融合多个版本的 C++ 导致跨平台有很大包袱,如果都是现代 C++、版本一致,较少的三方库,利用 CMake C++ 跨平台还是很好搞的。 |
9
antonius 2023-09-28 14:57:22 +08:00
1. C++ 有啥好用的包管理吗?
有,vcpkg 。我个人习惯用自己管理,然后用 cmake 构建,复杂了点,但是没什么外部依赖。 构建系统一般用 cmake ,也有[xmake]( https://xmake.io/#/),[GENie]( https://github.com/bkaradzic/GENie),[fips]( https://github.com/floooh/fips)。 2. C++ 每个版本变化都很大吗?应该怎么选择版本入手? 相比 C 来说,变化比较多。为了兼容性起见可以选择 C++11 或者 C++14 ,我个人更倾向于[Orthodox C++]( https://gist.github.com/bkaradzic/2e39896bc7d8c34e042b),在可读性和性能上保持一个平衡。 3. 跨平台写起来痛苦吗? 还好,涉及到跨平台的有:文件系统,图形以及系统 GUI 。不过也有相关的开源解决方案,比如 SDL2 、GLFW 等等。 |
11
cnbatch 2023-09-28 17:00:40 +08:00
(以下描述带有我个人的使用习惯,请谨慎参考)
包管理: Windows 用 vcpkg FreeBSD 用系统自带管理器 Linux 尽量用系统自带管理器,实在没办法了才用 vcpkg C++版本: 部份版本变化还是很大的,按分组来算(以下是我个人划分),那就是 第一组 C++98 、C++03 第二组 C++11/14/17 第三组 C++20/23 每一组内部的变化不算特别大,很容易平滑升级;组与组之间的变化比较大,可以当成新语言来学习 跨平台: 只要不是涉及到驱动层面、调用系统专属 API 的话,大多数纯命令行工具的跨平台不算痛苦,因为有不少第三方库包装得比较好,把平台差异抹平了 图形界面程序比较麻烦,主要是因为 Linux 割裂但又不完全割裂。如果不考虑 Linux ,只考虑 Windows 、BSD ,那就会轻松很多。Windows 不用多说,可以直接静态编译出单个 exe 到处用。BSD 也类似,静态编译出来后,同系列上下游都能用。同系列上下游是指 FreeBSD → GhostBSD 这种上下游衍生关系,不是 FreeBSD→NetBSD 这种的跨系列。 (此处只针对单纯的 GUI 界面程序,不涉及游戏 3D 绘图) |
12
standchan 2023-09-29 10:36:24 +08:00
op 提到了 c++和 go ,作为一个 c++转 go 那我应该可以说两句。
1 、以前写 linux c++的时候团队没有用什么包管理,一般都是自己手动变一(很蛋疼 2 、关于 c++的版本,貌似基金会加入挺多的特性的吧,但是目前还是 c++11 比较多,参考招聘要求一般都是 c++11 。这点跟 java 有点像,jdk 都已经 21 了,国内还是守着 8 不松手 3 、c++压根就不是跨平台的呀,写起来自然痛苦。有很多都要实际去编译,但是现在也可以用容器化去规避? 最后,我转了 go 。团队经过考虑调研之后决定把除了音视频相关的业务都转向了 go ,方便快捷静态编译,云原生友好,高并发加 gc ,总结就是四个字 爱不释手。 |