文章目录
- 预备
- 静态库
- 生成
- 链接
- 环境区别
- 动态库
- 生成
- 链接
- 环境区别
- END
- 参考
- ar指令
预备
准备两个文件,以最简单的形式进行展示。
add.c
int add(int x, int y) {return x + y;
}
main.c
为了方便直接在头文件中声明函数
#include <stdio.h>extern int add(int, int);int main() {int x = 1;int y = 2;printf("%d + %d = %d\n", x, y, add(x, y));
}
静态库
生成
生成object文件
gcc -c add.c
生成库
采用ar指令进行生成静态库,其中三个参数的含义为:
ar的参数 | |
---|---|
参数c | 创建一个库,不管库是否存在,都将创建。 |
参数s | 创建一个库,不管库是否存在,都将创建。 |
参数r | 在库中插入模块(替换)。默认新的成员添加在库的结尾处,如果模块名已经在库中存在,则替换同名的模块。 |
ar rcs libadd.a add.o
链接
链接操作静动态库一致
- -L 库的路径
- -l 库的名称,去掉前后缀
- 指定参数间的空格可有可无
gcc main.c -L . -l add
环境区别
经过测试,windows下为libxxx.a也可以
环境 | 常用命名 |
---|---|
Linux | libxxx.a |
Windows | libxxx.lib |
动态库
生成
生成object文件
需要添加-fpic
参数
gcc -c -fpic add.c
生成库
生成一个动态库,有可执行权限
不指定-o的话默认是a.exe/a.out
gcc -shared add.o -o libadd.dll
链接
链接操作静动态库一致
- -L 库的路径
- -l 库的名称,去掉前后缀
- 指定参数间的空格可有可无
gcc main.c -L . -l add
环境区别
环境 | 常用命名 |
---|---|
Linux | libxxx.so |
Windows | libxxx.dll |
END
参考
Linux 静态库和动态库 | 爱编程的大丙 (subingwen.cn)
侵删
ar指令
Usage: ar [emulation options] [-]{dmpqrstx}[abcDfilMNoOPsSTuvV] [--plugin <name>] [member-name] [count] archive-file file...ar -M [<mri-script]commands:d - delete file(s) from the archivem[ab] - move file(s) in the archivep - print file(s) found in the archiveq[f] - quick append file(s) to the archiver[ab][f][u] - replace existing or insert new file(s) into the archives - act as ranlibt[O][v] - display contents of the archivex[o] - extract file(s) from the archivecommand specific modifiers:[a] - put file(s) after [member-name][b] - put file(s) before [member-name] (same as [i])[D] - use zero for timestamps and uids/gids (default)[U] - use actual timestamps and uids/gids[N] - use instance [count] of name[f] - truncate inserted file names[P] - use full path names when matching[o] - preserve original dates[O] - display offsets of files in the archive[u] - only replace files that are newer than current archive contentsgeneric modifiers:[c] - do not warn if the library had to be created[s] - create an archive index (cf. ranlib)[l <text> ] - specify the dependencies of this library[S] - do not build a symbol table[T] - deprecated, use --thin instead[v] - be verbose[V] - display the version number@<file> - read options from <file>--target=BFDNAME - specify the target object format as BFDNAME--output=DIRNAME - specify the output directory for extraction operations--record-libdeps=<text> - specify the dependencies of this library--thin - make a thin archiveoptional:--plugin <p> - load the specified pluginemulation options: No emulation specific options
ar: supported targets: elf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 pei-i386 pe-x86-64 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big pe-bigobj-x86-64 pe-i386 srec symbolsrec verilog tekhex binary ihex plugin
Report bugs to <https://sourceware.org/bugzilla/>