C 语言为什么没有发展出类似依赖管理的框架?

2018-01-17 09:26:38 +08:00
 zjsxwc

就算浏览器上 es5 这种没有依赖注入容器,但也有 requirejs 这种管理依赖的东西,

C 语言是怎么管理代码执行时依赖关系?

这里我指的不是 makefile 这种只能算是文件层面的依赖管理。

6757 次点击
所在节点    程序员
34 条回复
neoblackcap
2018-01-17 09:29:16 +08:00
动态库?不是系统默认的包管理器吗?
crysislinux
2018-01-17 09:31:48 +08:00
哈哈,对啊,包管理就是。C 这种比较麻烦的地方是有 ABI 兼容问题
GuangXiN
2018-01-17 09:35:13 +08:00
谁说没有,RedHat 发展了 rpm,debian 发展了 apt,BSD 有 port
Juggernaut
2018-01-17 09:42:04 +08:00
C 一直在做底层有差别硬件的无差别化服务支持,一门心思走到底了
snnn
2018-01-17 09:56:39 +08:00
有。
去 google 的 github 里面找。
wellsc
2018-01-17 09:58:18 +08:00
pacman 啊
xd314697475
2018-01-17 10:24:30 +08:00
如果你说的包管理的话,看看 Conan

Conan, the C / C++ Package Manager for Developers

https://conan.io/
dychenyi
2018-01-17 10:27:18 +08:00
还用管理?可能没看懂题目。一个 setenv LD_LIBRARY_PATH XXX 不是解决了所有问题吗? 而且这是操作系统管理的。
mooncakejs
2018-01-17 10:30:15 +08:00
C 的跨平台是源码级跨平台,所以依赖就是源代码,动态库基本的依赖交给系统管理了。
yum/apt install libxxx 安装动态库
yum/apt install xxx-dev[el] 安装开发包
rogerchen
2018-01-17 10:32:13 +08:00
朋友,所有发行版的包管理器都是为了管理 C 系语言的依赖开发出来的,管理器多得一匹好吗。。。
sinxccc
2018-01-17 10:41:27 +08:00
UNIX 就是 C 的 runtime 啊ˊ_>ˋ
zj299792458
2018-01-17 10:43:52 +08:00
Apt-get ? brew ? macport ?
feather12315
2018-01-17 10:47:26 +08:00
autoconf 算不算
mengyaoss77
2018-01-17 11:12:20 +08:00
-L -l 算是依赖吧
包管理就用系统自带的啊 那么多!
feverzsj
2018-01-17 11:18:20 +08:00
因为 c/c++是应用平台最广的原生语言,无法在标准层面做出限制,即使 c++即将加入的 module,也不是和编译器绑定的
GeruzoniAnsasu
2018-01-17 11:52:07 +08:00
C 的代码是不可运行时改变的
编译生成可执行文件时就需要把所有的依赖包含进来
说白了 include 就是复制粘贴把所有用到的库的代码都粘贴进一个文件然后再开始编译

编译完了再生成可执行文件

作为静态语言的 C 压根就没有运行时代码注入和扩展的可能,自然不会有什么代码中间来一行 import,更不会有 try import raise,也更不可能在运行时来引入新的全局符号,静态语言的变量和代码符号都只是地址而已,当我们需要动态生成 /访问一个变量我们有指针,这是 C 的做法,跟有虚拟机的语言是很不一样的。

这跟 O 不 OO 半点关系都没有,你用 C++也不会存在你概念中那种所谓依赖管理框架,对于静态语言来说,依赖管理即库文件管理,即包管理
veelog
2018-01-17 11:56:11 +08:00
pkg-config 算吗
hitmanx
2018-01-17 12:00:28 +08:00
@GeruzoniAnsasu

> "编译生成可执行文件时就需要把所有的依赖包含进来 "
动态库链接可以是 stub 的呀

> "C 的代码是不可运行时改变的"
如果是来自动态链接的库可以啊,一是可以热更新,二是可以用 LD_PRELOAD(intercept)之类的手段在运行时先于真正的符号库加载
gnaggnoyil
2018-01-17 12:00:55 +08:00
然而讽刺的是,Makefile 等东西恰恰在 C 的所谓"依赖管理"中起到了主要作用——函数位置的确定都是靠 linker 来完成的,而 linker 的输入嘛……一般都是实现指定好的 object file.
yksoft1
2018-01-17 12:03:41 +08:00
毕竟 C 标准下要考虑到十几 K 内存的单片机的需求。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/423524

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX