解决在Mac下直接解压C++静态库出现的问题

发布时间 - 2026-01-10 22:07:22    点击率:

发现问题

C++的静态库(*.a文件)就是一个压缩包,把所有 *.o 文件打包在里面。

所以我想尝试做的事很简单:就是把静态库里的 *.o 文件都解压出来,然后在用这些 *.o 文件链接合并为一个动态库。我直接双击解压的,这样就得到了一堆的 *.o 文件。然后我执行了生成动态库的命令,类似如下:

c++ -g -dynamiclib -Wl,-headerpad_max_install_names -o libtest.dylib /usr/lib/libexpat.dylib /usr/lib/libz.dylib -framework ApplicationServices -framework OpenGL *.o 

结果一直报错:

ld: file not found: raw_codec.SkRawAdapterCodec.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)

解决方法

报错说找不到这个raw_codec.SkRawAdapterCodec.o文件,但是我确定文件是存在的。根据提示加了个-v参数,打印了详细的列表,发现这个raw_codec.SkRawAdapterCodec.o是第一个要加载的文件,说明可能所有文件都没被命令行识别。

我接着测试了其他的命令,单独对这一个raw_codec.SkRawAdapterCodec.o进行链接,不管什么参数都提示 ld: file not found 的错误。看来就是文件无法被加载。然后想着去项目原始目录里找被打包为静态库前的这个 *.o 文件,一测试居然成功了没报错!说明是从静态库里解压出来的 *.o 文件有问题。于是二进制对比两个文件,发现MD5是完全一致的,也就是说文件内容是没问题的。那么就是权限问题咯?把两个文件放到同一个目录下,用ls -l命令查看了一下,输出如下信息:

-rw-r--r-- 1 dom staff  734032 5 25 11:35 raw_codec.SkRawAdapterCodec2.o
-rw-r--r--@ 1 dom staff 734032 5 25 10:25 raw_codec.SkRawAdapterCodec.o

下面那个文件是出问题的文件,权限里居然出现了一个@,谷歌了一下,说这个是mac平台上的扩展属性标识,说明除了标准权限外还有其他的。可以用ls -@l命令查看具体是什么扩展属性,输出如下:

-rw-r--r-- 1 dom staff  734032 5 25 11:35 raw_codec.SkRawAdapterCodec2.o
-rw-r--r--@ 1 dom staff 734032 5 25 10:25 raw_codec.SkRawAdapterCodec.o
 com.apple.quarantine  29 

这个com.apple.quarantine是什么鬼呢?继续搜索,原来是我们经常看到的那个提示:「”xxx”是从互联网下载的应用程序。您确定要打开它吗?」。算是一种安全限制,在Mac OSX 10.5开始引入了这个属性,如果从浏览器下载,或使用系统的解压命令比如tar,zip等,都会自动给文件加上这个属性,导致第一打开需要弹窗允许。所以我们一直无法加载到这个raw_codec.SkRawAdapterCodec.o是因为它含有com.apple.quarantine扩展属性。

要删除这个属性可以使用命令:

xattr -d com.apple.quarantine 文件名 

或者直接删除整个文件夹里所有文件的这个属性:

xattr -dr com.apple.quarantine 文件夹名 

测试了一下,删除com.apple.quarantine属性后果然好了。其实更规范的解压静态库的方式是使用ar -x命令,使用ar命令就不会自动添加com.apple.quarantine属性了。可以批量解压一个文件夹下的所有 *.a 文件,在指定目录下执行这条命令即可:

ls *.a | xargs -n1 ar -x

最后测试了一下之前的命令,成功生成了动态库,大功告成~

总结

以上就是关于这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# 静态库解压  # mac  # 解压  # 静态库  # C++静态链接与动态链接详解  # C++静态变量  # 常量的存储位置你真的了解吗  # VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码  # 关于C++静态数据成员的实现讲解  # 用Visual Studio2017写C++静态库图文详解  # C/C++静态类和this指针详解及实例代码  # C++静态成员变量和静态成员函数的使用方法总结  # C++静态持续变量介绍  # 报错  # 其他的  # 是从  # 加载  # 库里  # 我想  # 这一  # 互联网  # 好了  # 看了  # 目录下  # 第一个  # 都没  # 找不到  # 可以用  # 这条  # 很简单  # 大功告成  # 就得  # 因为它 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  如何在腾讯云服务器快速搭建个人网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Laravel怎么为数据库表字段添加索引以优化查询  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  企业网站制作这些问题要关注  如何用搬瓦工VPS快速搭建个人网站?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  JS经典正则表达式笔试题汇总  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  html如何与html链接_实现多个HTML页面互相链接【互相】  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  LinuxShell函数封装方法_脚本复用设计思路【教程】  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  黑客如何通过漏洞一步步攻陷网站服务器?  javascript中的try catch异常捕获机制用法分析  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  浅谈javascript alert和confirm的美化  如何在阿里云完成域名注册与建站?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  实例解析Array和String方法  如何基于云服务器快速搭建个人网站?  如何用已有域名快速搭建网站?  🚀拖拽式CMS建站能否实现高效与个性化并存?  如何用好域名打造高点击率的自主建站?  如何在阿里云服务器自主搭建网站?  如何在云虚拟主机上快速搭建个人网站?  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  javascript基于原型链的继承及call和apply函数用法分析  Laravel如何处理异常和错误?(Handler示例)  网页设计与网站制作内容,怎样注册网站?  如何构建满足综合性能需求的优质建站方案?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  如何快速建站并高效导出源代码?  JavaScript实现Fly Bird小游戏  如何在服务器上配置二级域名建站?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Python文件异常处理策略_健壮性说明【指导】  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  详解Android图表 MPAndroidChart折线图  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Linux系统命令中tree命令详解  Win11怎么设置默认图片查看器_Windows11照片应用关联设置