六、基础I/O
4. 动静态库
既然我们能够成功创建静态库了,接下来我们将这个代码打包成动态库:
shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
动态库库名规则:libxxx.so
我们这里在Makefile里面实现:
- L 命令就是告诉编译器我们链接的库在哪个路径下。
我们可以在Makefile里:
所以给别人使用代码时,直接给对方发送这个压缩包即可。
因为我之前编译的时候只是告诉了编译器我们的链接文件和头文件在哪,现在是运行当中,操作系统并不知道链接文件在哪。所以我们应该怎么解决呢?我们有4种做法:①直接将动态链接库拷贝到系统中。②将不在系统默认库搜索路径下的库路径添加到环境变量 LD_LIBARAY_PATH 中。③通过软链接方式在系统库目录里面添加同名目录。④通过配置文件即可
如果我们同时提供动态库和静态库,gcc默认使用的是动态库。如果我们非要静态链接,我们必须使用static选项。如果我们只提供静态链接,那么程序会对这个库进行局部静态链接,程序的其他库仍可能是动态链接的。如果我们只提供动态库,强制使用静态链接则会发生链接报错。
动态库加载后,会被映射到进程的共享区中。 所有系统进程中公共的代码和数据,只需要在物理内存中存在一份即可。