设为首页
收藏本站
开启辅助访问
全部
问与答
创意
技术
酷工作
生活
交易
资源
节点
飞墙
Follow
明白贴
人人影库
报酬
登录
注册
飞社-令人惊奇的创意工作者社区-
›
首页
›
React
›
gcc 是怎么找到 system 函数的定义(实现)的? ...
FSHEX=FIND+SHARE+EXPRESS
飞社-令人惊奇的创意工作者社区- 是一个关于发现分享表达的地方
现在登录
没有账号?
立即注册
推荐主题
›
🎉小棉袄出生, 生殖隔离已打破
›
哪吒 2 大家贡献了多少米
›
第一辆车,买自己喜欢的,还是懂车的推荐的
›
丁克十年的感想
›
上班通勤遇到了点状况,拜托了各位f友
今日热议主题
有没有轻量化的 Windows 沙箱/虚拟机,用于
有没有可以查看某个行业占比最高的基金的 A
[北京/深圳] [抖音集团-财经研发-零钱] 后
关于 Solana 链 token 转移
好了,这下头上是真的长摄像头了
购买了华为平板,想科学使用有什么注意事项
有大佬知道 gcp 服务器没有 udp 流量是咋回
求问关于 curosr/copliot 以及 LLM agent
腾讯元宝微信小程序怎么在 mac 上的鼠标滚
想要一个类似 bulletin 的 AI 驱动的新闻总
gcc 是怎么找到 system 函数的定义(实现)的?
rookiemaster
· 2024-3-20 10:23:35 · 359 次点击
程序如下:
```c
int main()
{
system("echo hello world");
}
```
使用 gcc 编译时会警告找不到 system 的声明:</br>
```
DoubleHash.c: In function ‘main’:
DoubleHash.c:3:5: warning: implicit declaration of function ‘system’ [-Wimplicit-function-declaration]
3 | system("echo hello world");
| ^~~~~~
```
但是程序仍然可以运行,我想知道编译器是怎么找到 system 的定义的?
举报
·
359 次点击
登录
注册
站外分享
微信扫一扫
QQ分享
微博分享
豆瓣分享
复制链接
显示全部
|
最新评论
15 条回复
沙发
ho121
小成
2024-3-20 10:29:20
应该是链接 glibc 时找到的,毕竟大部分程序都需要 glibc
我猜的。
板凳
geelaw
小成
2024-3-20 10:43:00
system 是标准库函数,链接的时侯默认是带标准库的,所以找到了。
C 语言没有函数重载,不需要复杂的名称修饰,int system(…); 和 int system(char const *); 链接的时候去找的是同一个符号,前者是隐式声明的结果,后者是标准库的声明,故隐式声明的调用可以链接到标准库函数。
地板
seers
小成
2024-3-20 10:54:25
运行时候会去 ld.conf 找符号
5#
yolee599
初学
2024-3-20 11:08:45
int add(int a, int b) 和 float add(float a, int b, int c) 的符号是同一个,运行的时候函数会通过栈传递参数。编译的时候是通过符号来链接的,如果在头文件定义了这个函数,类型不匹配编译会出错,而如果头文件不定义,只要符号对上了编译就会成功,只会报警告。
6#
churchmice
小成
2024-3-20 11:30:09
推荐你看一下 link & loader
7#
wodexinhaoleng
小成
2024-3-20 12:21:28
问题的方向错了,这个问题你应该问这个警告是从哪来的
因为 C 语言最初的设计上,函数调用本来就是不需要声明的。只是后面的编译器保留了兼容性
8#
proxytoworld
初学
2024-3-20 12:47:09
你不熟悉程序编译过程,首先 gcc 会先生成.a 文件,而后进行链接,在链接的时候找到了 system ,所以能编译出来,system 在 libc 里面。如果你使用一个不存在的函数,在链接的时候找不到,就会报错了。
9#
pagxir
小成
2024-3-20 13:02:43
函数声明在 stdlib.h ,实现自然在 libc ,默认都会链接 libc 的。不 include stdlib 直接用 system 大概率在 64 位系统下程序崩溃
10#
653513754
小成
2024-3-20 13:43:59
推荐你看一下编译之后的汇编,可以清楚的看出来系统是怎么找到 system 的
下一页 »
1
2
/ 2 页
下一页
返回顶部