
<p id="34J7SOKT">在日常开发中,其实大部分时间我们都会和第三方库或系统库打交道。</p><p id="34J7SOKU">在 Android 开发音视频开发领域,一般会用到 FFmepg、OpenCV、OpenGL 等等开源库, 我们一般都会编译成动态库共我们程序使用。</p><p id="34J7SOKV">对于类 unix 系统,静态库为<strong>.a</strong>, 动态库为<strong>.so</strong>。而 windows 系统静态库为<strong>.lib</strong>, 动态库为<strong>.dll</strong>。</p><p id="34J7SOL0">静态链接库</p><p id="34J7SOL1">回顾程序编译的四个步骤:</p><p><blockquote id="34J7SOMA">预编译-> 编译 -> 汇编 -> 链接<br/></blockquote></p><p id="34J7SOL3">静态库和动态库就是在链接阶段行为不同,静态库会在链接阶段将汇编生成的目标文件.o 与引用的库一起链接打包到可执行文件中。静态库其实就是一系列目标文件的集合,可以用 ar 工具打包生成。</p><p id="34J7SOL4"><strong>静态库特点有:</strong></p><p id="34J7SOL5">●静态库对函数的链接在编译时期完成;</p><p id="34J7SOL6">● 程序在运行时与函数库再无关系;</p><p id="34J7SOL7">● 浪费资源空间,因为所有相关的目标文件都会被链接到一个可执行文件中。</p><p id="34J7SOL8">我们来看一个例子:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2024%2F1028%2Fda082f06j00sm2ajv0007d0008p007bp.jpg&thumbnail=660x&quality=80&type=jpg"/><br/><br/></p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2024%2F1028%2Fcee6a808j00sm2ak40004d000p.jpg&thumbnail=660x&quality=80&type=jpg"/><br/><br/></p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2024%2F1028%2Feaf90a84j00sm2al7000ad000ap009up.jpg&thumbnail=660x&quality=80&type=jpg"/><br/><br/></p><p id="34J7SOLE">使用 clang 生成编译成目标文件</p><p><blockquote id="34J7SOMB">clang++ -c Math.cpp<br/></blockquote></p><p id="34J7SOLG">接着使用 ar 命令打包目标文件,生成静态库文件libmath.a</p><p><blockquote id="34J7SOMC">ar -r libmath.a Math.o<br/></blockquote></p><p id="34J7SOLI"><strong>ar 命令有一些常用参数:</strong></p><p id="34J7SOLJ">● -t: 按顺序显示归档中的文件名;</p><p id="34J7SOLK">● -d: 从归档中删除指定文件。</p><p id="34J7SOLL"><strong>链接静态库:</strong></p><p><blockquote id="34J7SOMD">clang++ main.cpp -L. -lmath -o main<br/></blockquote></p><p id="34J7SOLN">生成成功后,执行 https://www.163.com/dy/article/main 执行</p><p id="34J7SOLO"><strong>解释下参数:</strong></p><p id="34J7SOLP">● -L: 表示要链接的库所在目录,如果不指定就会在系统 usr/lib 或 usr/local/lib下查找;</p><p id="34J7SOLQ">● -l: 指定链接时的动态库或静态库,如果有动态将会优先被链接。</p><p id="34J7SOLS">动态链接库</p><p id="34J7SOLT">使用动态库的原因,正式因为静态库很耗费内存空间,并且静态库更新简直是灾难,如果库源码发生变动,那么静态库将不得不重新生成。</p><p id="34J7SOLU"><strong>动态库</strong><strong>特点如下:</strong></p><p id="34J7SOLV">● 延迟加载一些库函数,既用到才加载;</p><p id="34J7SOM0">● 动态库可以同时被多个程序共享,节省内存。</p><p id="34J7SOM1">借着上面的例子,显示动态库的使用,首先,生成动态链接库文件</p><p><blockquote id="34J7SOME">clang++ Math.o -shared -fPIC -Wall -o libmath.so<br/></blockquote></p><p id="34J7SOM3">生成动态链接库文件后,再使用如下命令生成可执行文件</p><p><blockquote id="34J7SOMF">clang++ main.cpp -L. -lmath -o main<br/></blockquote></p><p id="34J7SOM5"><strong>执行 https://www.163.com/dy/article/main</strong></p><p><blockquote id="34J7SOMG"><strong>参数说明:</strong><br/>● -shared: 表示生成的是动态链接库<br/>● -fPIC: 生成位置独立的代码,用于编译共享库。在任意内存空间都可以被加载<br/>● -Wall: 生成所有警告信息<br/><br/></blockquote></p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2024%2F1028%2F3def27c0j00sm2an5007md000dw008pp.jpg&thumbnail=660x&quality=80&type=jpg"/><br/><br/></p>
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/187985.html