解决在Mac下直接解压C++静态库出现的问题
2019/7/10 22:52:05
本文主要是介绍解决在Mac下直接解压C++静态库出现的问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
发现问题
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++静态库出现的问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品 审核中
- 2024-12-27TypeScript面试真题解析与实战指南
- 2024-12-27TypeScript大厂面试真题详解与解析
- 2024-12-26怎么使用nsenter命令进入容器?-icode9专业技术文章分享
- 2024-12-26导入文件提示存在乱码,请确定使用的是UTF-8编码怎么解决?-icode9专业技术文章分享
- 2024-12-26csv文件怎么设置编码?-icode9专业技术文章分享
- 2024-12-25TypeScript基础知识详解
- 2024-12-25安卓NDK 是什么?-icode9专业技术文章分享
- 2024-12-25caddy 可以定义日志到 文件吗?-icode9专业技术文章分享
- 2024-12-25wordfence如何设置密码规则?-icode9专业技术文章分享