设为首页
收藏本站
开启辅助访问
全部
问与答
创意
技术
酷工作
生活
交易
资源
节点
飞墙
Follow
明白贴
影视
报酬
登录
注册
飞社-令人惊奇的创意工作者社区-
›
首页
›
React
›
gcc 是怎么找到 system 函数的定义(实现)的? ...
FSHEX=FIND+SHARE+EXPRESS
飞社-令人惊奇的创意工作者社区- 是一个关于发现分享表达的地方
现在登录
没有账号?
立即注册
推荐主题
›
现在经济这么差的么
›
EcoPaste - 免费开源剪贴板神器,斩获 2.4k
›
大家怎么看待 cg 这件事情
›
是去是留?
›
观贴《各位对小区野猫什么态度》有感
今日热议主题
出华为 mate60Pro+
上海联通现在有什么办理大流量的渠道或套餐
20241128 午夜俱乐部
听说 OLED 显示器显示文本有彩边,在 macOS
两行代码自动检测、安装和引用多个 Python
黑五买什么?
年底了,深圳小伙伴出显示器吗?自提
WeClipper - 极简剪切板助手 - v0.2.0 - 极
发现一个 SUNO 音乐 API 无水印版本!支持
反 Microsoft Edge 浏览器联盟成立了 🤣🤣
gcc 是怎么找到 system 函数的定义(实现)的?
rookiemaster
· 2024-3-20 10:23:35 · 247 次点击
程序如下:
```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 的定义的?
举报
·
247 次点击
登录
注册
站外分享
微信扫一扫
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 页
下一页
返回顶部