Skip to main content

Posts

Featured

mac平台下动态库和静态库的创建与使用

1. clang的部分编译参数: -E: 编译预处理,输出文件的扩展格式一般为.i(c语言)和.ii(c++),实际上在mac的终端里执行clang -E 的结果是直接输出到屏幕,可以通过数据流重导向命令输出到指定文件 -fsyntax-only:执行编译预处理,句法分析和语义分析阶段,如果代码有错误信息会输出相关错误信息或者警告 -S:执行上述阶段并生成中间代码(汇编代码),输出文件格式的扩展名为.s -c:通过汇编器将.s文件翻译成目标文件,也就是.o文件 -L:库文件的搜索路径 -l:库名称(不是库文件名而是库名,例如有个libdemo.so的库文件,则库名为demo -fPIC:编译为位置独立的代码 -shared:编译成动态库 2. 什么是库文件?   比方说,当我们用c语言编写程序的时候,会用到一些经常使用的代码,例如控制输入输出的函数printf和scanf,文件的读取写入等等,如果每次我们写程序都要自己来写的话就会很麻烦,于是c语言就将这些底层的会重复使用的代码提前编译好打包成一个文件,这个文件就是库文件(library)。也就是说可以把库文件理解成目标文件的集合。当我们要使用的时候只要在程序开头用include命令将相关的头文件包含进来就可以了。         库文件根据链接方式的不同可以分为动态库(dynamic library)和静态库(static library)。 动态库: 动态库将目标文件与库的链接推迟到程序运行的时候,当不同的程序使用到同一个库的时候,内存里只需要有一份库文件的拷贝,节省了内存空间,实现了库文件的共用,所以动态库也称为共享库。Linux平台下动态库文件的扩展名为.so,Windows平台下为.dll。macos X下的动态库文件为.dylib,是.so格式的扩展 静态库: 静态库是在程序编译的时候在目标文件的链接过程中由链接器将目标文件和库文件直接链接成一个可执行文件,这样当不同的程序使用到同一个库的时候,每个可执行文件都有一份库文件的拷贝,浪费了空间和资源。Linux平台下静态库文件的扩展名为.a文件,Windows下为.lib 3. macOS下库文件的创建与使用         假设有1.cp...

Latest Posts

程序的编译