• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 解决在Mac下直接解压C++静态库出现的问题

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

作者:idom 字体:[增加 减小] 来源:互联网 时间:2017-05-28

idom 通过本文主要向大家介绍了c++获取mac地址,dev c++ mac,mac c++ ide,静态mac地址,静态mac等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

发现问题

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 
</div>

结果一直报错:

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

解决方法

报错说找不到这个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
</div>

下面那个文件是出问题的文件,权限里居然出现了一个@,谷歌了一下,说这个是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 
</div>

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

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

xattr -d com.apple.quarantine 文件名 
</div>

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

xattr -dr com.apple.quarantine 文件夹名 
</div>

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

ls *.a | xargs -n1 ar -x
</div>

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

总结

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 解决在Mac下直接解压C++静态库出现的问题
  • C++获得本机所有网卡的IP和MAC地址信息的实现方法
  • C++获取本机MAC,IP,MASK地址的方法
  • C++中引用&与取地址&的区别分析

相关文章

  • 2017-05-28详解散列表算法与其相关的C语言实现
  • 2017-05-28C++类URL编码和解码使用技巧
  • 2017-05-28C++实现广度优先搜索实例
  • 2017-05-28从汇编看c++中多态的应用
  • 2017-05-28如何用C语言生成简单格式的xml
  • 2017-05-28C++ namespace相关语法实例分析
  • 2017-05-28C++动态内存分配(new/new[]和delete/delete[])详解
  • 2017-05-28牛顿迭代法求多项式在1.5附近的值2*x的3次幂--4x平方+3*x-6=0的实现代码
  • 2017-05-28C++中引用的使用总结
  • 2017-05-28C++ 中滚动条的滚动问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言中数组的一些基本知识小结
    • C语言 文件的打开与关闭详解及示例代码
    • C语言 格式化读写文件详解
    • C++ 学习之旅三 我和超级玛丽有个约会
    • C++临时性对象的生命周期详细解析
    • C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法
    • 浅析char 指针变量char *=p 这个语句的输出问题
    • C语言演示对归并排序算法的优化实现
    • DSP中浮点转定点运算--举例及编程中的心得
    • 深入探讨:main函数执行完毕后,是否可能会再执行一段代码?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有