1 Star 0 Fork 0

wfoo00/Linux

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Linux_25_软硬链接.cpp 23.96 KB
一键复制 编辑 原始数据 按行查看 历史
wfoo00 提交于 2024-05-08 20:01 . update Linux_25_软硬链接.cpp.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
#define _CRT_SECURE_NO_WARNINGS 1
Linux_25_软硬链接
[a@192 1]$ echo "hello world" > file_target1.txt //输出重定向到文件
[a@192 1]$ cat file_target1.txt //查看文件内容
hello world
[a@192 1]$ ll - i //查看 inode编号
total 4
3312126 - rw - rw - r--. 1 a a 12 May 6 07 : 58 file_target1.txt
[a@192 1]$ pwd //查看当前文件所在路径
home / a / Desktop / a / bb / 1
[a@192 1]$ df - h //查看磁盘的挂载情况和容量
Filesystem Size Used Avail Use % Mounted on
devtmpfs 471M 0 471M 0 % / dev
tmpfs 487M 0 487M 0 % / dev / shm
tmpfs 487M 8.5M 478M 2 % / run
tmpfs 487M 0 487M 0 % / sys / fs / cgroup
dev / sda3 14G 5.8G 7.5G 44 % /
dev / sda1 297M 152M 145M 52 % / boot
tmpfs 98M 36K 98M 1 % / run / user / 1000
[a@192 1]$ ll - i
total 4
3312126 - rw - rw - r--. 1 a a 12 May 6 07:58 file_target1.txt
//————————————————————————————————————————————————————————————————————————————
软连接
[a@192 1]$ ln - s file_target1.txt file_soft.link //link(链接), soft(柔软的).创建软链接 file_soft.link 后者链接前者 .txt
[a@192 1]$ ll -i
3312130 lrwxrwxrwx. 1 a a 16 May 6 08 : 00 file_soft.link -> file_target1.txt //软连接也有自己独立的 inode,也是一个独立的文件
3312126 - rw - rw - r--. 1 a a 12 May 6 07 : 58 file_target1.txt
[a@192 1]$
[a@192 1]$ touch file_target2.txt //创建新文件
[a@192 1]$ ls
file_soft.link file_target1.txt file_target2.txt
[a@192 1]$ echo "hello bit" > file_target2.txt //输出重定向到文件 file_target2.txt
[a@192 1]$ ll
total 8
lrwxrwxrwx. 1 a a 16 May 6 08:00 file_soft.link->file_target1.txt
- rw - rw - r--. 1 a a 12 May 6 07 : 58 file_target1.txt
- rw - rw - r--. 1 a a 10 May 6 08 : 14 file_target2.txt
[a@192 1]$ cat file_target2.txt //查看文件内容
hello bit
[a@192 1]$ ll - i //查看 inode编号
total 8
3312130 lrwxrwxrwx. 1 a a 16 May 6 08 : 00 file_soft.link->file_target1.txt
3312126 - rw - rw - r--. 1 a a 12 May 6 07 : 58 file_target1.txt
3312137 - rw - rw - r--. 1 a a 10 May 6 08 : 14 file_target2.txt
[a@192 1]$ cat file_soft.link //软连接的内容是:目标文件所对应的路径字符串。(类似于Windows当中的快捷方式)
hello world //软连接类似于Windows桌面的快捷方式,当删除快捷方式时,并不影响该软件的使用情况。
[a@192 1]$ rm file_target1.txt //如果目标文件删除了,软连接就无效了(快捷方式失效了)
[a@192 1]$ ll
lrwxrwxrwx. 1 a a 16 May 6 08 : 00 file_soft.link -> file_target1.txt //出现【红色警告】与【闪烁】
[a@192 1]$ cat file_soft.link
cat : file_soft.link : No such file or directory //没有这样的文件或目录
[a@192 1]$
[a@192 1]$ cd test / //目录 test 中创建目录 bin,conf
[a@192 test]$ mkdir bin
[a@192 test]$ mkdir conf
[a@192 test]$ ll
total 0
drwxrwxr - x. 2 a a 6 May 6 08:40 bin
drwxrwxr - x. 2 a a 6 May 6 08 : 41 conf
[a@192 test]$ cd bin //进入 bin 目录,然后连续创建目录
[a@192 bin]$ mkdir - p a / b / c //bin 目录中创建 a目录, a目录中创建 b目录, b目录中创建 c目录 。
[a@192 bin]$ cd .. / ..
[a@192 1]$ tree test //以树状展示 test 目录下的 子目录 。
test
├── bin
│   └── a
│   └── b
│   └── c
└── conf
5 directories, 0 files
//或者在test 目录下时
[a@192 test]$ tree . //以树状展示 test 目录下的 子目录 。
.
├── bin
│   └── a
│   └── b
│   └── c
└── conf
//————————————————————————————————————————————————————————————————————————————
创建软连接
[a@192 test]$ cp / usr / bin / ls myls //复制一段 ls 命令程序, 到当前目录 改名叫 myls
[a@192 test]$ ll
total 116
drwxrwxr - x. 3 a a 15 May 6 08 : 41 bin
drwxrwxr - x. 2 a a 6 May 6 08 : 41 conf
- rwxr - xr - x. 1 a a 117608 May 6 08 : 51 myls
[a@192 test]$ mv myls bin / a / b / c //移动 myls 到文件深处
[a@192 test]$ mkdir log //test 文件中存在着许许多多文件
[a@192 test]$ ll
total 0
drwxrwxr - x. 3 a a 15 May 6 08 : 41 bin
drwxrwxr - x. 2 a a 6 May 6 08 : 41 conf
drwxrwxr - x. 2 a a 6 May 6 08 : 52 log
[a@192 test]$ . / bin / a / b / c / myls //我们要想 运行 myls 每次带绝对路径会非常麻烦。
bin conf log
[a@192 test]$ . / bin / a / b / c / myls - l
total 0
drwxrwxr - x. 3 a a 15 May 6 08 : 41 bin
drwxrwxr - x. 2 a a 6 May 6 08 : 41 conf
drwxrwxr - x. 2 a a 6 May 6 08 : 52 log
[a@192 test]$ ln - s bin / a / b / c / myls run.link //于是我们可以 创建软连接 run.link
[a@192 test]$ ll
total 0
drwxrwxr - x. 3 a a 15 May 6 08 : 41 bin
drwxrwxr - x. 2 a a 6 May 6 08 : 41 conf
drwxrwxr - x. 2 a a 6 May 6 08 : 52 log
lrwxrwxrwx. 1 a a 14 May 6 08 : 55 run.link->bin / a / b / c / myls //成功创建出 软连接
[a@192 test]$ . / run.link //直接运行 软连接 也可以执行 myls 程序命令。
bin conf log run.link
[a@192 test]$ . / run.link - l
total 0
drwxrwxr - x. 3 a a 15 May 6 08 : 41 bin
drwxrwxr - x. 2 a a 6 May 6 08 : 41 conf
drwxrwxr - x. 2 a a 6 May 6 08 : 52 log
lrwxrwxrwx. 1 a a 14 May 6 08 : 55 run.link->bin / a / b / c / myls
[a@192 test]$
[a@192 test]$ cd conf /
[a@192 conf]$ mkdir - p e/f/g //conf 文件中创建 e文件, e文件中创建 f文件, f文件中创建 g文件.
[a@192 conf]$ cd ..
[a@192 test]$ tree .
.
├── bin
│   └── a
│   └── b
│   └── c
│   └── myls
├── conf
│   └── e
│   └── f
│   └── g
├── log
└── run.link->bin / a / b / c / myls
//或者只展示 conf /
[a@192 test]$ tree conf /
├── conf /
│   └── e
│   └── f
│   └── g
[a@192 test]$ ll
total 0
drwxrwxr - x. 3 a a 15 May 6 08:41 bin
drwxrwxr - x. 3 a a 15 May 6 09 : 02 conf
drwxrwxr - x. 2 a a 6 May 6 08 : 52 log
lrwxrwxrwx. 1 a a 18 May 6 09 : 11 my.conf->conf / e / f / g / my.conf
lrwxrwxrwx. 1 a a 14 May 6 08 : 55 run.link->bin / a / b / c / myls
[a@192 test]$ touch conf / e / f / g / my.conf //在文件深处创建一个文件 my.conf
[a@192 test]$ vim conf / e / f / g / my.conf //如果每次要在深处打开这个文件,进行编辑内容会非常麻烦。
[a@192 test]$ ln - s conf / e / f / g / my.conf conf.link //创建软连接。 此时 软连接的作用就体现出来了。
[a@192 test]$ ll
total 0
drwxrwxr - x. 3 a a 15 May 6 08:41 bin
drwxrwxr - x. 3 a a 15 May 6 09 : 02 conf
lrwxrwxrwx. 1 a a 18 May 6 09 : 14 conf.link->conf / e / f / g / my.conf //成功创建软连接
drwxrwxr - x. 2 a a 6 May 6 08 : 52 log
lrwxrwxrwx. 1 a a 18 May 6 09 : 11 my.conf->conf / e / f / g / my.conf
lrwxrwxrwx. 1 a a 14 May 6 08 : 55 run.link->bin / a / b / c / myls
[a@192 test]$ vim conf.link //直接以软连接的形式 进行文件的编辑 (非常方便)
//编辑内容:
//test.exe : XXXXX
//log.txt : YYYYY
//比如:当我们使用各种 库 的时候,(路径非常多、繁琐)通过软连接的形式来使用就会方便许多
//————————————————————————————————————————————————————————————————————————————
硬连接
[a@192 1]$ ln file_target2.txt file_hard.link
[a@192 1]$ ll - i
total 12
3312137 - rw - rw - r--. 2 a a 10 May 6 08 : 14 file_hard.link //硬链接不是一个独立的文件,没有独自的 inode,共用目标文件的 inode number
3312130 lrwxrwxrwx. 1 a a 16 May 6 08 : 00 file_soft.link->file_target1.txt
3312126 - rw - rw - r--. 1 a a 12 May 6 07 : 58 file_target1.txt
3312137 - rw - rw - r--. 2 a a 10 May 6 08 : 14 file_target2.txt// 【2】 表示有两个映射关系
[a@192 1]$
硬链接就是一个文件名 inode 的映射关系,
建立硬链接,就是在指定目录下,添加一个新的文件名 inode number 的映射关系。
映射关系也由【1 变成 2
文件的磁盘级引用计数:有多少个文件名字符串 通过 inode number 指向这个 文件(inode)
删除 原本的文件名 ,剩下的那一个就相当于给 原文件重命名了。
映射关系也由【2 变成 1
只有当 计数为【0 才会真正的删除这个文件。
//————————————————————————————————————————————————————————————————————————————
定位一个文件的方式只有两种
①、通过路径 // <==> 软连接
②、直接找到目标文件的 inode // <==> 硬链接
两种方式最终 都要通过 inode number 的。
//————————————————————————————————————————————————————————————————————————————
任何一个目录,刚开始新建的时候,引用计数一定是2
【① . 【②它本身】
目录 A 内部新建一个目录,会让 A目录 的引用计数自动 +1
一个目录内有几个目录:A 引用计数 -2
比如目录 A 中创建一个子目录后:
子目录的【① ..】和 【②它本身】 以及本身所在目录的 【③ .】一共存在3 引用计数
硬链接用途:
1.构建 Linux 的路径结构,让我们可以使用. .. 来进行路径定位。
Linux 系统中,不允许给目录建立硬链接,避免形成【 路径环绕 】。
[a@192 1]$ ln dir dir.hard // 给目录建立硬链接时
ln: 'dir': hard link not allowed for directory //Linux中:不允许给目录建立硬链接
2.硬链接一般是用来做文件备份的。
//————————————————————————————————————————————————————————————————————————————
1.打开的文件--->内核,内存
2.没打开的文件--->磁盘,文件系统相关。
文本写入,二进制写入,是语言层的概念,由C语言进行 类型的相互转换。
例如:
//int a = 123456;
//printf("%d", a);
我们看到的实际是在显示器打印 '1''2''3''4''5''6'字符。
所以有了 ASCLL 码表。 就是给C语言的某些函数做字符转化的。
————————————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————
动态库和静态库
1.我们有没有用过库呢 ? 用过CC++的标准库
STL, list, vector, stack, queue, map, set ...
strerror, strstr, strcpy, memset... 这些函数必须得有具体的实现
[whb@bite - alicloud lesson231$ ldd a.out
linux - vdso.so.1 = > (0x80007ffd9fdad088)
libc.so.6 = > / lib64 / libc.so.6(0x00007f9a90a67000) //【 C 标准库 】
lib64 / 1d - 1inux - x86 - 64.so.2(0x00007f9a90e35000)
//软连接,链接的 C标准库
[whb@bite - alicloud lesson23]$ ls / lib64 / libc.so.6 - l
Irwxrwxrwx 1 root root 12 Oct 22 2022 /lib64/libc.so.6 -> libc - 2.17.so //软连接,链接的 C标准库
[whb@bite - alicloud lesson23]$ ls / lib64 / libc - 2.17.so - l
- rwxr - xr - x1 root root 2156592 May 19 2022 / 1ib64 / libc - 2.17.so //【 C 标准库 】
2.
Linux :
.so (动态库)
.a (静态库)
windows :
.dll(动态库)
.lib(静态库)
————————————————————————————————————————————————————————————————————————————
原文件 目标文件 可执行文件
x.c --> x.o
y.c --> y.o
z.c --> z.o 链接形成可执行,main.exe
main.c --> main.o
.o 目标文件(可重定位目标文件)
————————————————————————————————————————————————————————————————————————————
< 生成同名.o >
-rw - rw - r--. 1 a a 109 May 8 09:22 mymath.c
- rw - rw - r--. 1 a a 1535 May 8 09 : 15 mystdio.c
// < gcc -c 生成同名 .o 目标文件 >
[a@192 stdio]$ gcc -c mymath.c mystdio.c
- rw - rw - r--. 1 a a 109 May 8 09 : 22 mymath.c
- rw - rw - r--. 1 a a 1344 May 8 09 : 37 mymath.o
- rw - rw - r--. 1 a a 1535 May 8 09 : 15 mystdio.c
- rw - rw - r--. 1 a a 2792 May 8 09 : 37 mystdio.o
把所有 .o 目标文件 拷贝给 舍友(roommate
drwxrwxr - x. 2 a a 6 May 8 09:40 roommate
drwxrwxr - x. 2 a a 105 May 8 09 : 37 stdio
[a@192 dir]$ cd roommate /
[a@192 roommate]$ ll
total 0
[a@192 roommate]$ cp .. / stdio/*.o . //拷贝上级目录下 stdio 中的所有 .o 文件给舍友
[a@192 roommate]$ ll
total 8
-rw-rw-r--. 1 a a 1344 May 8 09:41 mymath.o
-rw-rw-r--. 1 a a 2792 May 8 09:41 mystdio.o
把所有 .h 头文件 拷贝给 舍友(roommate,但是 .c 实现不能拷贝给舍友
[a@192 roommate]$ cp .. / stdio/* .h .
- rw - rw - r--. 1 a a 56 May 8 10 : 13 mymath.h
- rw - rw - r--. 1 a a 1344 May 8 10 : 13 mymath.o
- rw - rw - r--. 1 a a 857 May 8 10 : 13 mystdio.h
- rw - rw - r--. 1 a a 2792 May 8 10 : 13 mystdio.o
根据头文件和.o 文件, 我们可以使用 实现的内容
-rw - rw - r--. 1 a a 511 May 8 10:22 main.c
————————————————————————————————————————————————————————————————————————————
// 《 main.c 》
#include "mystdio.h"
#include "mymath.h"
#include <stdio.h>
#include <string.h>
int main()
{
int a = 10;
int b = 20;
//int myAdd(int, int);
printf("%d+%d=%d\n", a, b, myAdd(a, b));
//myFILE* my_fopen(const char *psth, const char *flag);
myFILE* fp = my_fopen("./myfile.txt", "w");
if (fp == NULL) return 1;
const char* message = "这是我写的:hello world!\n";
//ssize_t my_fwrite(myFILE *fp, const char *data, int len);
my_fwrite(fp, message, strlen(message));
my_fclose(fp);
return 0;
}
//————————————————————————————————————————————————————————————————————————————
[a@192 roommate]$ gcc - c main.c // 把main.c 编译成 .o文件
[a@192 roommate]$ ll
total 24
- rw - rw - r--. 1 a a 511 May 8 10 : 22 main.c
- rw - rw - r--. 1 a a 2040 May 8 10 : 26 main.o
- rw - rw - r--. 1 a a 56 May 8 10 : 13 mymath.h
- rw - rw - r--. 1 a a 1344 May 8 10 : 13 mymath.o
- rw - rw - r--. 1 a a 857 May 8 10 : 13 mystdio.h
- rw - rw - r--. 1 a a 2792 May 8 10 : 13 mystdio.o
[a@192 roommate]$ gcc main.o mymath.o mystdio.o -o myexe // 再把3个 .o 文件融合成一个 myexe 的.o文件
[a@192 roommate]$ ll
total 36
- rw - rw - r--. 1 a a 511 May 8 10 : 22 main.c
- rw - rw - r--. 1 a a 2040 May 8 10 : 26 main.o
- rwxrwxr - x. 1 a a 9072 May 8 10 : 26 myexe
- rw - rw - r--. 1 a a 56 May 8 10 : 13 mymath.h
- rw - rw - r--. 1 a a 1344 May 8 10 : 13 mymath.o
- rw - rw - r--. 1 a a 857 May 8 10 : 13 mystdio.h
- rw - rw - r--. 1 a a 2792 May 8 10 : 13 mystdio.o
[a@192 roommate]$ . / myexe // 执行可执行程序 myexe 得到求值结果,并且生成文件myfile.txt
10 + 20 = 30 // 得到 Add(10 + 20)的结果
[a@192 roommate]$ ll
total 40
- rw - rw - r--. 1 a a 511 May 8 10 : 22 main.c
- rw - rw - r--. 1 a a 2040 May 8 10 : 26 main.o
- rwxrwxr - x. 1 a a 9072 May 8 10 : 26 myexe
- rw - rw - r--. 1 a a 31 May 8 10 : 27 myfile.txt // 并且生成文件myfile.txt
- rw - rw - r--. 1 a a 56 May 8 10 : 13 mymath.h
- rw - rw - r--. 1 a a 1344 May 8 10 : 13 mymath.o
- rw - rw - r--. 1 a a 857 May 8 10 : 13 mystdio.h
- rw - rw - r--. 1 a a 2792 May 8 10 : 13 mystdio.o
[a@192 roommate]$ cat myfile.txt // 查看文件内容:这是我写的:hello world!
这是我写的:hello world!
[a@192 roommate]$
//————————————————————————————————————————————————————————————————————————————
//————————————————————————————————————————————————————————————————————————————
// 《 把 .o 打包》
但是 .o 文件过多时,万一不小心误删了1 就跑不起来了
- rw - rw - r--. 1 a a 1344 May 8 10:13 mymath.o
// ... ...
- rw - rw - r--. 1 a a 2792 May 8 10 : 13 mystdio.o
// 融合所有 .o 目标文件
[a@192 roommate2]$ ar - rc libmyc.a * .o //把所有 .o 打包命名为:libmyc.a
- rw - rw - r--. 1 a a 4404 May 8 11 : 24 libmyc.a
// 把目标文件 libmyc.a 和头文件交给你的舍友
- rw - rw - r--. 1 a a 4404 May 8 11 : 24 libmyc.a
- rw - rw - r--. 1 a a 511 May 8 10 : 22 main.c //舍友自己实现 main.c
- rw - rw - r--. 1 a a 56 May 8 10 : 13 mymath.h
- rw - rw - r--. 1 a a 857 May 8 10 : 13 mystdio.h
[a@192 roommate2]$ gcc main.c libmyc.a //联合自己的 main.c 和 融合的.o 文件 编译
[a@192 roommate2]$ ll
total 32
- rwxrwxr - x. 1 a a 9072 May 8 11 : 29 a.out //生成默认可执行程序 a.out
- rw - rw - r--. 1 a a 4404 May 8 11 : 24 libmyc.a
- rw - rw - r--. 1 a a 511 May 8 10 : 22 main.c
- rw - rw - r--. 1 a a 56 May 8 10 : 13 mymath.h
- rw - rw - r--. 1 a a 857 May 8 10 : 13 mystdio.h
[a@192 roommate2]$ . / a.out //执行程序
10 + 20 = 30
[a@192 roommate2]$ ll
total 36
- rwxrwxr - x. 1 a a 9072 May 8 11 : 29 a.out
- rw - rw - r--. 1 a a 4404 May 8 11 : 24 libmyc.a
- rw - rw - r--. 1 a a 511 May 8 10 : 22 main.c
- rw - rw - r--. 1 a a 31 May 8 11 : 29 myfile.txt //生成文件
- rw - rw - r--. 1 a a 56 May 8 10 : 13 mymath.h
- rw - rw - r--. 1 a a 857 May 8 10 : 13 mystdio.h
[a@192 roommate2]$ cat myfile.txt //显示文件内容
这是我写的:hello world!
[a@192 roommate2]$
所谓的 库文件,本质就是把 .o 打包
————————————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————
//头文件 是一个手册 ,提供函数的声明,告诉用户怎么用,
// .o 提供实现,我们只需要补上一个mian,调用头文件提供的方法,
//然后和 .o 进行连接,就能形成 可执行
静态库 -->
mylib 中创建的两个目录 include lib
[a@192 roommate2]$ tree mylib
mylib
├── include //拷贝我们自己写的头文件
└── lib //拷贝我们自己写的 .o 包
拷贝
[a@192 mylib]$ cp ../*.h include/
[a@192 mylib]$ cp ../*.a lib/
[a@192 roommate2]$ tree mylib /
mylib /
├── include
│   ├── mymath.h
│   └── mystdio.h
└── lib
└── libmyc.a
把生成的静态库 安装到系统中
[a@192 roommate2]$ sudo cp mylib / include/*.h /usr/include/ // .h 把我们自己写的库 安装到系统中
[a@192 roommate2]$ sudo cp mylib / lib/*.a /lib64 // .o 包
-rw - rw - r--1 whb whb 374 Apr 14 11:43 main.c
drwxrwxr - x4 whb whb 4096 Apr 14 11 : 52 mylib //拷贝过去后,这个就相当于安装包,就可以不要了
[whb@bite - alicloud roommate]$ rm mylib / -rf //删除安装包,不影响使用。
//[a@192 roommate2]$ ar -rc libmyc.a *.o // myc 这个是自己的 库名
C / C++的库,gcc / g++默认是认识c / C++
libmyc.a-- > 别人写的(第三方提供)->gcc / g++ 不认识->使用: -l
//[a@192 roommate2]$ gcc main.c -l myc //就可以了
- rwxrwxr - x1 whb whb 17096 Apr 14 11:58 a.out
- rw - rw - r--1 whb whb 374 Apr 14 11 : 56 main.c
[whb@bite - alicloud roommate]$ . / a.out
10 + 20 = 30
[a@192 roommate2]$ cat myfile.txt //显示文件内容
这是我写的:hello world!
这样可以吧我们写的 .o 安装到系统中,但是极不推荐:
[a@192 roommate2]$ sudo rm / usr / include / mystdio.h //卸载我们自己写的非官方代码
[a@192 roommate2]$ sudo rm / usr / include / mymath.h //2个头文件,一个 .o 包
[a@192 roommate2]$ sudo rm /lib64/ libmyc.a
————————————————————————————————————————————————————————————————————————————
I include ,也要在我的路径下找一下头文件
gcc 也是进程,有自己的路径 + ./mylib/include/ 就找到了我的头文件
[a@192 roommate2]$ gcc main.c -I ./mylib/include/
链接报错!
L 也要把我们写的 .o 链接上去, -L + 路径
[a@192 roommate2]$ gcc main.c -I ./mylib/include/ -L ./mylib/lib
报错!
(该目录可能存在很多库,具体要找谁呢?)
(注意:libmyc.a库名要去掉 前缀lib,后缀.a ==> myc )
-l (link:执行确定的第三方库 名称)
[a@192 roommate2]$ gcc main.c -I ./mylib/include/ -L ./mylib/lib -l myc
————————————————————————————————————————————————————————————————————————————
头文件的 < > " "
头文件不包含在库中时,去掉 I
[a@192 roommate2]$ gcc main.c -L ./mylib/lib -l myc
#include <mylib/include/mymath.h> // < > 会在系统的目录下去找
找不到!
在当前目录下 找到
#include "mylib/include/mystdio.h" // " " 会优先在当前目录下找。
#include "mylib/include/mymath.h"
————————————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/wfoo00/linux.git
git@gitee.com:wfoo00/linux.git
wfoo00
linux
Linux
master

搜索帮助