一、linux下的静态库和动态库
linux和windows下都有大量的库,库在本质上就是可执行的二进制代码,可以被操作系统载入内存执行。我们通常将一些通用函数写成函数库,所以库是别人写好的,现有的,成熟的,可以复用的代码,你可以使用但要必须得遵守许可协议。
1.静态库
静态库的文件命名方式是“libxxx.a",库名前加"lib",windows和linux下都是用后缀”.a",“xxx"为静态库名,windows下的静态库名也是“libxxx.a”。
链接时间:静态库的代码是在程序编译过程中载入代码的。
链接方式:静态库的链接方式是将整个函数库的所有数据都整合进目标代码中。静态链接的优点是在编译后的程序不再需要外部函数库的支持。但是,如果静态库发生更新改变,程序必须重新编译。
2.动态库
动态库的文件命名方式和静态库相似是"libxxx.so",库名前加"lib",后缀为”.so"。而windows下动态库命名为"libxxx.dll"。dll即"dynamic link library"。
链接时间:动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函数。这样做缺点是因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。优点是动态库的改变并不影响你的程序,所以动态函数库升级比较方便。
当同一个程序分别使用静态库,动态库两种方式生成两个可执行文件时,静态链接所生成的文件所占用的内存要远远大于动态链接所生成的文件。这是因为静态链接是在编译时将所有的函数都编译进了程序,而动态链接是在程序运行时由操作系统帮忙把动态库调入到内存空间中使用。另外如果动态库和静态库同时存在时,链接器优先使用动态库。
在linux下可以通过ar命令来创建一个静态库。
如果希望把源码 file1.c、flle2.c、…fileN.c 做成库文件,则我们可以分别通过下面命令把他们制作成静态库或动态库:
静态库:
gcc -c file1.c
gcc -c file2.c
…
gcc -c fileN.c
ar -rcs libname.a file1.o file2.o … fileN.o
其中,-r选项即replace,-c即create,-s即static。
动态库:
gcc -shared -fPIC -o libname.so file1.c file2.c … fileN.c
使用静态库或动态库:
gcc main.c -o myapp -L lib_path -lname
其中“-L”选项指定库所在的路径,"-l"(小写L)选项指定库的名字。
二、gcc常见编译选项
| 选项 | 说明 |
|---|---|
| -E | 只进行预处理,不编译 |
| -S | 只编译,不汇编 |
| -c | 只编译,汇编,不链接 |
| -g | 编译生成的可执行文件包含gdb调试信息,可被gdb调试 |
| -o | 指定编译生成的可执行文件名 |
| -I(大写的i) | 指定include包含的头文件的搜索路径 |
| -L | 指定动态链接时动态库所在的路径 |
| -l(小写的L) | 指定动态链接时动态库的名字 |
| -ansi | ansi标准 |
| -std=99 | C99标准 |
| -Werror | 不区分警告和错误,遇到任何警告都停止编译 |
| -Wall | 开启大部分警告提示 |
| --static | 静态编译 |
| -static | 静态链接 |
| -O0 | 关闭所有优化选项 |
| -O1 | 第一级别优化,使用此选项可使可执行文件更小、运行更快,并不会增加太多编译时间,可以简写 为-O |
2295




被折叠的 条评论
为什么被折叠?



