解决在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

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

总结

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

(0)

相关推荐

  • Mac下使用Eclipse编译C/C++文件出现 launch failed, binary not found 解决方案

    新建C/C++工程第一页,toolchains选择哪个都一样,如图: 第二步: 而后点击"Advanced settings",出现下图: 将第一项取消,第二项选上,点击 OK. 而后点击下一步,点击结束. 新工程完成后,随便新建一个语法正确的初始 .c 文件,然后 command+b "Build All",根目录下出现Binaries目录,大功告成!

  • 详解C++的JSON静态链接库JsonCpp的使用方法

    JsonCpp部署方法: 在http://sourceforge.net/projects/jsoncpp/中下载最新版本的jsoncpp库源码. 之后将jsoncpp-src-版本号-tar.gz解压出来,打开makefiles中的jsoncpp.sln进行编译,之后build文件夹下的vs71\debug\lib_json中会有一个.lib静态链接库. JsonCpp主要包含三种类型的class:Value Reader Writer. jsoncpp中所有对象.类名都在namespace

  • 老生常谈C语言静态函数库的制作和使用

    C语言的函数库是多组经过验证的常用函数的集合,编写C语言程序时使用库函数,既可以提高程序运行效率,又可以提高编程质量,使用方法如#include 和#include. 根据使用库函数时,函数库加载时机的差异,将函数库分为静态函数库和动态函数库,具体差异是:C语言程序如果使用静态函数库的函数,那么整个函数库的代码都会和C语言程序一起编译成可执行代码,程序的体积会膨胀:如果使用动态函数库的函数,则C语言程序只会和函数库文件名以及函数名一起编译成可执行代码(不编译函数代码),运行时去查找函数库文件和函

  • C++获得本机所有网卡的IP和MAC地址信息的实现方法

    一台机器上可能不只有一个网卡,但每一个网卡只有一个MAC地址,而每一个网卡可能配置有多个IP地址:如平常的笔记本电脑中,就会有无线网卡和有线网卡(网线接口)两种:因此,如果要获得本机所有网卡的IP和MAC地址信息,则必须顺序获得每个网卡,再依次获取其信息等:在windows sdk中,用IP_ADAPTER_INFO结构体存储网卡信息,包括网卡名.网卡描述.网卡MAC地址.网卡IP等,该结构体的主要描述如下所示: typedef struct _IP_ADAPTER_INFO { struct

  • C++获取本机MAC,IP,MASK地址的方法

    本文实例讲述了C++获取本机MAC,IP,MASK地址的方法,分享给大家供大家参考.具体方法如下: 复制代码 代码如下: #include "InitSock.h"  #include <stdio.h>    #include <iphlpapi.h>  #pragma comment(lib, "IPHLPAPI.lib")    u_char g_ucLocalMac[6];  DWORD g_dwGatewayIP;  DWORD g

  • 如何利用Emacs来调试C++程序

    俗话说,Emacs是神的编辑器,而Vim是编辑器之神.高手程序员都是用这两样神器进行开发.本人觉得,Emacs之所以厉害,是因为许多在其他编辑器下必须用鼠标点选很多步的操作,在Emacs下都可以通过键盘来完成.大大地节省了你在显示器上找按钮的时间.Emacs在Linux上运行感觉比windows流畅些,用Emacs编辑程序时,手基本不用离开键盘,就可以完成所有的工作.那么今天就让我们看看如何利用Emacs来调试C++程序. 一.安装Emacs和GCC 下载地址:Emacs:http://www.

  • 动态库调用静态库示例讲解

    生成动态库: 需要的目标文件得用-fPIC选项生成. 而静态库所需的目标文件可以不用-fPIC选项. 例: 复制代码 代码如下: /////// static.h void static_print(); ///////static.cpp #include <iostream> #include "static.h" void static_print() { std::cout<<"This is static_print function&quo

  • 解决在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

  • 手把手教你使用Python解决简单的zip文件解压密码

    目录 简介 文件创建 纯数字密码 字母数字混合密码 补充说明 简介 使用的核心模块是python标准库中的zipfile模块.这个模块可以实现zip文件的各种功能,具体可以查看官方参考文档.这里的暴力破解的意思是对密码可能序列中的值一个一个进行密码尝试,这对人来说是很难的,可是对计算机而言并不难.有时候我们下载的zip文件需要密码解压而我们不知道,需要付费才知道.所以这里主要介绍两种暴力破解的密码:纯数字密码和英文数字组合密码. 文件创建 首先测试文件为test.txt(仅包含单行文本),压缩后

  • linux下怎么解压.tar.gz .tar.bz2命令

    从网络上下载到的源码包, 最常见的是 .tar.gz 包, 还有一部分是 .tar.bz2包 要解压很简单 : .tar.gz     格式解压命令为          tar   -zxvpf   xx.tar.gz .tar.bz2   格式解压命令为          tar   -jxvpf    xx.tar.bz2 //p参数可以保留原文件权限(很重要) 以上所述是小编给大家介绍的linux下怎么解压.tar.gz .tar.bz2命令,希望对大家有所帮助,如果大家有任何疑问欢迎给我

  • Windows10下安装解压版MySQL教程图文详解

    MySQL安装分为安装版和解压版,安装版主要是由一个exe程序式安装,有界面鼠标点击安装即可,小白建议使用安装版安装mysql,相比较与安装版,解压版安装更"纯净",没有多余的东西,但是较为复杂,坑点也比较多(都是泪),本教程位于提供安装MySQL最新版8.0.11的正确姿势(滑稽) 1.到MySQL官网下载压缩包 网址:https://dev.mysql.com/downloads/mysql/ 这里我们选择MySQL Community Server 点击Download 接下来点

  • Linux下g++编译与使用静态库和动态库的方法

    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成与使用方式是不同的.刚开始可能会不适应,但是用多了应该会习惯这种使用,因为步骤上并没有VS下配置那么繁琐. 下面就分别总结下linux下生成并使用静态库与动态库的方法:(由于是C++项目,所以编译器用的g++,但是与gcc的使用是相通的) 首先是准备工作,把我们需

  • 解压版MYSQL安装及遇到的错误及解决方法

    1 安装 在 MYSQL官网进行下载相应的解压版本,然后放在你所想的目录下. 解压内容如下: 然后我们需要去创建一个名为my.ini文件,注意文件后缀一定要是.ini结尾,如果文件后缀隐藏了,可以将其勾选上,如图: 创建文件:my.ini. 其内容如下: [client] port=3306 default-character-set=utf8 [mysqld] # 设置为自己MYSQL的安装目录 basedir=D:\Program Files\mysql-5.7.24-winx64 # 设置

  • win10下mysql5.7.21解压版安装教程

    win10下安装解压版的Mysql,具体如下 环境:win10 64位 压缩包下载地址,如图 下载解压后,进入文件夹: 配置基础文件-my.ini: [mysql] ; 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] ;设置3306端口 port = 3306 ; 设置mysql的安装目录 basedir=D:\ALEX\Mysql\mysql-5.7.21-winx64 ; 设置mysql数据库的数据的存放目录 datadir=D:\AL

  • Linux解压文件到指定目录的方法

    本文介绍了Linux解压文件到指定目录的方法,分享给大家,具体如下: tar在Linux上是常用的打包.压缩.加压缩工具,他的参数很多,折里仅仅列举常用的压缩与解压缩参数 参数: -c :create 建立压缩档案的参数: -x : 解压缩压缩档案的参数: -z : 是否需要用gzip压缩: -v: 压缩的过程中显示档案: -f: 置顶文档名,在f后面立即接文件名,不能再加参数 举例: 一,将整个/home/www/images 目录下的文件全部打包为 /home/www/images.tar

  • linux xz压缩解压的方法小结

    先给大家介绍下linux xz压缩解压的方法小结 1. 解压 xz 格式文件 方法一: 需要用到两步命令,首先利用 xz-utils 的 xz 命令将 linux-3.12.tar.xz 解压为 linux-3.12.tar,其次用 tar 命令将 linux-3.12.tar 完全解压. xz -d linux-3.12.tar.xz tar -xf linux-3.12.tar 方法二(推荐) tar -Jxf linux-3.12.tar.xz 2. 创建 xz 格式文件 方法一: 也是用

  • C#中关于zip压缩解压帮助类的封装 附源码下载

    c#下压缩解压,主要是用第三方类库进行封装的.ICSharpCode.SharpZipLib.dll类库,链接地址为你官方下载链接.压缩主要是用流的方式进行压缩的. 压缩文件及文件夹.文件压缩很简单,把待压缩的文件用流的方式读到内存中,然后放到压缩流中.就可以了.文件夹就稍微麻烦下了.因为要把待压缩的文件夹解压后保留文件夹文件的层次结构.所以我的实现方式就是 递归遍历文件夹中的文件.计算其相对位置放到压缩流中. 代码如下 复制代码 代码如下: /// <summary>        ///

随机推荐