目录java
目录git
根据PPT中:
的命令出错。正则表达式
在以下项目结构中:
使用 gcc -c -I/include src/say_hello.c
命令出错。编程
src/say_hello.c:2:11: 致命错误:say_hello.h:没有那个文件或目录 2 | # include "say_hello.h" | ^~~~~~~~~~~~~ 编译中断。
问题缘由分析:
gcc命令格式出错,-I
应与 头文件所在目录
分离。vim
问题解决方案:并发
-I
与 头文件所在目录
分离,再将生成文件导出到 include
文件夹下,命令以下:编辑器
gcc -c -I include src/say_hello.c -o include/say_hello.o
可生成:函数
[yogile@yogile-pc gcc_test]$ tree . ├── bin ├── include │ ├── say_hello.h │ └── say_hello.o ├── libs ├── makefile ├── Readme.md └── src ├── main.c └── say_hello.c 4 directories, 6 files
输入命令 gcc src/main.c -I include/ -L libs/ -o bin/main
报错。学习
[yogile@yogile-pc gcc_test]$ gcc src/main.c -I include/ -L libs/ -o bin/main src/main.c: 在函数‘main’中: src/main.c:5:2: 警告:隐式声明函数‘say_hello’ [-Wimplicit-function-declaration] 5 | say_hello(); | ^~~~~~~~~ /usr/bin/ld: /tmp/ccKSn7Vo.o: in function `main': main.c:(.text+0xa): undefined reference to `say_hello' collect2: 错误:ld 返回 1
问题缘由分析:
发生"undefined reference to"
错误有多种缘由(点击查看)。在这里是因为连接时缺失了二进制文件(say_hello.o)。测试
问题解决方案:
方法一:
将命令中最开始的 "src/main.c"
改成"src/*.c"
,直接将全部的源文件一块儿从新汇编成二进制文件,再一块儿编译。
gcc src/*.c -I include/ -L libs/ -o bin/main
方法二:
直接将缺乏的二进制文件加入编译命令,在 src/main.c -I
中间添加 include/say_hello.o
。
[yogile@yogile-pc gcc_test]$ gcc src/*.c -I include/ -L libs/ -o bin/main [yogile@yogile-pc gcc_test]$ bin/main hello word
gcc -c -I include/ src/say_hello.c -o include/say_hello.o ar rcvs libs/libsay_h.a include/say_hello.o # 屏幕输出提示:r - include/say_hello.o gcc src/*.c -I include/ -L libs/ -o bin/main # 运行可执行文件便可: [yogile@yogile-pc gcc_test]$ bin/main hello word
gcc -fPIC -c -I include/ src/say_hello.c -o include_so/say_hello.o gcc -shared -o include_so/libsay_h.so include_so/say_hello.o gcc src/main.c include_so/say_hello.o -I include/ -L libs/ -o bin/main_so # 运行可执行文件便可: [yogile@yogile-pc gcc_test]$ bin/main_so hello word
[yogile@yogile-pc gcc_test]$ tree . ├── bin │ ├── main │ └── main_so ├── include │ ├── say_hello.h │ └── say_hello.o ├── include_so │ └── say_hello.o ├── libs │ ├── libsay_h.a │ └── libsay_h.so ├── makefile ├── Readme.md └── src ├── main.c └── say_hello.c 5 directories, 11 files
强弱符号解析处理规则有三:
疑惑1:对于规则2,若在 main.c
文件中,定义弱符号 x
;在 module_2.c
文件中,定义强符号 x=3
,在 main.c
中输出显示 x
为多少?
疑惑2:对于规则3,到底会选用哪一个弱符号?
回答疑惑1:
对于规则2,不管强符号在哪一个模块定义,在其余模块调用同名符号时,连接器都会选择该模块的强符号,测试以下。
main.c# include <stdio.h> # include "mod.h" int x; int main() { printf("x_start = %d\n", x); x=1; mod_2(); printf("x = %d\n", x); return 0; }
module_2.c
# include <stdio.h> # include "mod.h" int x=3; void mod_2() { printf(" x_2 = %d\n", x); }
编译运行结果为:
# include <stdio.h> # include "mod.h" int x; int main() { printf("x_start = %d\n", x); x=1; mod_2(); printf("x = %d\n", x); return 0; }# include <stdio.h> # include "mod.h" int x=3; void mod_2() { printf(" x_2 = %d\n", x); }[yogile@yogile-pc 7.6.1]$ ./mod.out x_start = 3 x_2 = 1 x = 1[yogile@yogile-pc 7.6.1]$ ./mod.out x_start = 3 x_2 = 1 x = 1
回答疑惑2:
对于规则三,若都是弱符号(即:未初始化,编译时初值为0),根据资料,所谓“随机选定的”是指占用空间最大的,选定后不会更改,测试以下。
main.c# include <stdio.h> # include "mod.h" int x; int main() { printf("x_start = %d\n", x); mod_2(); x=1; mod_2(); printf("x = %d\n", x); return 0; }
module_2.c
# include <stdio.h> # include "mod.h" int x; void mod_2() { printf(" x_2 = %d\n", x); }
编译运行结果为:
# include <stdio.h> # include "mod.h" int x; int main() { printf("x_start = %d\n", x); mod_2(); x=1; mod_2(); printf("x = %d\n", x); return 0; }# include <stdio.h> # include "mod.h" int x; void mod_2() { printf(" x_2 = %d\n", x); }[yogile@yogile-pc 7.6.1]$ ./mod.out x_start = 0 x_2 = 0 x_2 = 1 x = 1[yogile@yogile-pc 7.6.1]$ ./mod.out x_start = 0 x_2 = 0 x_2 = 1 x = 1
已更改 statistics.sh(ssss.sh)
中 find . -name "*.java"
更改成 find . -name "*.c"
。
对应仓库网页连接:https://gitee.com/Yogile/Cpt_System_Yogile
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 4000行 | 20篇 | 280小时 | |
第一周 | 66/66 | 1/1 | 24/24 |
计划学习时间:16小时
实际学习时间:24小时