如何对静态库编译增加arm64的支持
之前app用到的libmp3lame.a静态库,也要支持64位的模拟器(x86_64)和64位的真机(arm64)指令集。需要重新编译
查阅了下资料,按照如下步骤,并做了些注释和改动
1.http。//sourceforge。net/projects/lame/files/lame/3.99/ 下载lame的最新版本解压到一个文件夹里例如 lame,全路径如下/Users/8wm/Desktop/lame
2.下载build的脚本,我这里使用的是国外一个朋友的分享
https。//github。com/kewlbear/lame-ios-build
下载之后得到lame-build.sh拷贝到文件夹/Users/8wm/Desktop/lame
3.用bbedit或者其他编辑器打开这个脚本,按照注释修改
4.打开Terminals,
输入
cd /Users/8wm/Desktop/lame
chmod 777 lame-build.sh
sudo -s#
输入系统密码
./lame-build.sh
开始编译,编译完成之后。生成fat-lame目录和thin-lame目录,分别存放合并所有指令集的静态库,以及各指令集的静态库.
根据所需,copy lame.h和libmp3lame.a文件到project里,就可以正常使用了。
可以使用命令行,查看换个库支持的指令集。
lipo -info libmp3lame.a
Architectures in the fat file: libmp3lame.a are: armv7 armv7s i386 x86_64 arm64
以下是build的脚本,请注意黄色的字和注释。
#!/bin/sh
make distclean
CONFIGURE_FLAGS="--disable-shared --disable-frontend"
ARCHS="arm64 armv7s x86_64 i386 armv7"
# directories
# SOURCE是下载lame源码包,解压后的目录,可以把sh脚本放到这个目录,source改为""
SOURCE=""
# FAT是所有指令集build后,输出的目录,所有静态库被合并成一个静态库
FAT="fat-lame"
# SCRATCH是下载lame源码包,解压后的目录,必须是绝对路径
SCRATCH="/Users/8wm/Desktop/lame"
# must be an absolute path
# THIN 各自指令集build后输出的静态库所在的目录,每个指令集为一个静态库
THIN=`pwd`/"thin-lame"
COMPILE="y"
LIPO="y"
if [ "$*" ]
then
if [ "$*" = "lipo" ]
then
# skip compile
COMPILE=
else
ARCHS="$*"
if [ $# -eq 1 ]
then
# skip lipo
LIPO=
fi
fi
fi
if [ "$COMPILE" ]
then
CWD=`pwd`
echo "$CWD/$SOURCE........."
for ARCH in $ARCHS
do
echo "building $ARCH..."
mkdir -p "$SCRATCH/$ARCH"
cd "$SCRATCH/$ARCH"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]
then
PLATFORM="iPhoneSimulator"
if [ "$ARCH" = "x86_64" ]
then
SIMULATOR="-mios-simulator-version-min=7.0"
HOST=x86_64-apple-darwin
else
SIMULATOR="-mios-simulator-version-min=5.0"
HOST=i386-apple-darwin
fi
else
PLATFORM="iPhoneOS"
SIMULATOR=
HOST=arm-apple-darwin
fi
XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`
CC="xcrun -sdk $XCRUN_SDK clang -arch $ARCH"
#AS="$CWD/$SOURCE/extras/gas-preprocessor.pl $CC"
CFLAGS="-arch $ARCH $SIMULATOR"
CXXFLAGS="$CFLAGS"
LDFLAGS="$CFLAGS"
CC=$CC $CWD/$SOURCE/configure \
$CONFIGURE_FLAGS \
--host=$HOST \
--prefix="$THIN/$ARCH" \
CC="$CC" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS"
make -j3 install
cd $CWD
done
fi
if [ "$LIPO" ]
then
echo "building fat binaries..."
mkdir -p $FAT/lib
set - $ARCHS
CWD=`pwd`
cd $THIN/$1/lib
for LIB in *.a
do
cd $CWD
lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB
done
cd $CWD
cp -rf $THIN/$1/include $FAT
fi
一:什么是静态库,来自百度百科 程序编译一般需经预处理、编译、汇编和链接几个步骤。在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。
1.http。//sourceforge。net/projects/lame/files/lame/3.99/ 下载lame的最新版本解压到一个文件夹里例如 lame,全路径如下/Users/8wm/Desktop/lame2.下载build的脚本,我这里使用的是国外一个朋友的分享
https。//github。com/kewlbear/lame-ios-build
下载之后得到lame-build.sh拷贝到文件夹/Users/8wm/Desktop/lame
3.用bbedit或者其他编辑器打开这个脚本,按照注释修改
4.打开Terminals,
输入
cd /Users/8wm/Desktop/lame
chmod 777 lame-build.sh
sudo -s#
输入系统密码
./lame-build.sh
开始编译,编译完成之后。生成fat-lame目录和thin-lame目录,分别存放合并所有指令集的静态库,以及各指令集的静态库.
根据所需,copy lame.h和libmp3lame.a文件到project里,就可以正常使用了。
可以使用命令行,查看换个库支持的指令集。
lipo -info libmp3lame.a
Architectures in the fat file: libmp3lame.a are: armv7 armv7s i386 x86_64 arm64
以下是build的脚本,请注意黄色的字和注释。
#!/bin/sh
make distclean
CONFIGURE_FLAGS="--disable-shared --disable-frontend"
ARCHS="arm64 armv7s x86_64 i386 armv7"
# directories
# SOURCE是下载lame源码包,解压后的目录,可以把sh脚本放到这个目录,source改为""
SOURCE=""
# FAT是所有指令集build后,输出的目录,所有静态库被合并成一个静态库
FAT="fat-lame"
# SCRATCH是下载lame源码包,解压后的目录,必须是绝对路径
SCRATCH="/Users/8wm/Desktop/lame"
# must be an absolute path
# THIN 各自指令集build后输出的静态库所在的目录,每个指令集为一个静态库
THIN=`pwd`/"thin-lame"
COMPILE="y"
LIPO="y"
if [ "$*" ]
then
if [ "$*" = "lipo" ]
then
# skip compile
COMPILE=
else
ARCHS="$*"
if [ $# -eq 1 ]
then
# skip lipo
LIPO=
fi
fi
fi
if [ "$COMPILE" ]
then
CWD=`pwd`
echo "$CWD/$SOURCE........."
for ARCH in $ARCHS
do
echo "building $ARCH..."
mkdir -p "$SCRATCH/$ARCH"
cd "$SCRATCH/$ARCH"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]
then
PLATFORM="iPhoneSimulator"
if [ "$ARCH" = "x86_64" ]
then
SIMULATOR="-mios-simulator-version-min=7.0"
HOST=x86_64-apple-darwin
else
SIMULATOR="-mios-simulator-version-min=5.0"
HOST=i386-apple-darwin
fi
else
PLATFORM="iPhoneOS"
SIMULATOR=
HOST=arm-apple-darwin
fi
XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`
CC="xcrun -sdk $XCRUN_SDK clang -arch $ARCH"
#AS="$CWD/$SOURCE/extras/gas-preprocessor.pl $CC"
CFLAGS="-arch $ARCH $SIMULATOR"
CXXFLAGS="$CFLAGS"
LDFLAGS="$CFLAGS"
CC=$CC $CWD/$SOURCE/configure \
$CONFIGURE_FLAGS \
--host=$HOST \
--prefix="$THIN/$ARCH" \
CC="$CC" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS"
make -j3 install
cd $CWD
done
fi
if [ "$LIPO" ]
then
echo "building fat binaries..."
mkdir -p $FAT/lib
set - $ARCHS
CWD=`pwd`
cd $THIN/$1/lib
for LIB in *.a
do
cd $CWD
lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB
done
cd $CWD
cp -rf $THIN/$1/include $FAT
fi
Makefile.am 规则和实例详解
注意:静态库编译连接时需要其它的库的话,采用XXXX_LIBADD选项,而不是前面的XXXX_LDADD。编译静态库是比较简单的,因为直接可以指定其类型。 三、配置动态库 如果想要编译XXX.so动态库文件,需要用到_PROGRAMS类型,有一个关于安装路径的问题,如果希望将动态库安装到lib目录下,按照前面所说的,只需要写成lib_PROGRAMS就...
exe工程使用了静态库也会生成.lib文件
exe工程使用了静态库也会生成.lib文件。静态库的使用方式只有一种,即静态载入,在程序编译链接阶段,会将静态库中的所有数据都链接合并到最终生成的exe文件中,链接完成后就不再需要静态库文件,这样方便程序移植,但是也带来程序臃肿过大的弊端。同时,如果静态库中函数有所变化,所有引用它的工程需要重新...
什么叫静态库和动态库
程序编译过程中,公共代码的复用常常通过编译为库文件来实现,分为静态库和动态库。静态库,编译时即被复制到可执行文件中,确保代码完整拷贝,但可能导致冗余。其特点是与程序运行紧密相连,但占用较多内存空间。动态库,如Windows下的.dll和Linux下的.so,是一种动态链接库。其代码和数据独立于可执行...
Linux编译器-gcc\/g++
链接阶段将目标代码文件与所需的库文件结合,生成可执行文件或库文件。完成链接后,即可生成最终的可执行文件。在 C 程序中,`printf` 函数的实现位于系统库文件 libc.so.6 中。当编译时未特别指定库路径时,gcc 会搜索默认的库路径 `\/usr\/lib` 来链接 libc.so.6。静态库在编译链接时将库文件的...
请教vxworks静态库的问题。
加上-fpic命令就可以了,因为库的属性不对
OpenCV静态库编译与链接
以OpenCV-4.0.0为例说明在Ubuntu环境下的静态库编译与链接方法:opencv依赖第三方的库,所以当把opencv编译成静态库的时候,注意要把它运行时必要的依赖库也编译进来,opencv源码内有自己的3rdparty,主要有:libjpeg、libpng、libtiff、libzlib、libwebp、libprotobuf、ffmpeg(用到video时编译)、libgtk(...
linux下使用nm指令查看静态库\/动态库编译内容
首先,对于静态库,我们可以使用命令 nm -g libname.a 执行后,如图所示,它会列出静态库中的全局变量和函数接口,让你清晰地看到库的内部结构。而对于动态库,其查看方式为 nm -g libname.so 同样会显示出动态库的编译内容,包括函数和符号,这对于定位和修复与库相关的bug时非常有用。因此,在链接...
我编译A静态库的时候依赖了B静态库,我编译的程序依赖A静态库和B静态库...
静态库在程序的链接阶段被复制到了程序中。你用依赖这个词。程序编译一般需经预处理、编译、汇编和链接几个步骤。在链接步骤中,静态库才会被复制。因为静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系。存在几个链接?那么就几分拷贝。
gcc升级后静态库要升级吗
gcc升级后静态库需要升级源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似\/usr\/lib64\/libstdc++.so.6: version `GLIBCXX_3.4.21' not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。GCC...
linux 静态库和动态库编译的区别
然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。两种库的编译产生方法:第一步要把源代码编绎成...
保阮康妇: 静态库生成两个版本,真机版本和模拟器版本, 如果使用错误就会报错,
黑水县13210477354: 怎么把 armeabi 库编译为 arm64 - v8a - ?
保阮康妇: * Oh snap! You got an error! Change this and that and try again. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum.Take this action Or do this
黑水县13210477354: so库如何适配安卓32bit\64bit 的cpu 怎么编译 - ?
保阮康妇: 在libs文件下建arm64-v8a,armeabi,armeabi-v7a,mips,mips64,x86,x86_64文件夹,然后把编译好的so文件拷贝进去 app/build.gradle的android选项卡下添加 ndk{ abiFilters "armeabi","armeabi-v7a","x86","x86_64","mips","mips64",...
黑水县13210477354: linux下怎样使用自己创建的一个静态库: 这个静态库中有一个全局变量和函数,会在库外被调用,怎样实现? - ?
保阮康妇: 先编译源代码生成这个静态库,如:libmyfunc.a,存放目录为:./lib 在编译执行码时,增加以下参数:-L./lib -lmyfunc
黑水县13210477354: android studio 2.2.2 32位怎么配置ndk cmake环境 - ?
保阮康妇: 编译mac静态库 这个比较简单,直接Xcode -GXcode,然后用xcodebuild命令即可.编译Andoird静态库 编译android库我们同样可以引入一个toolchain文件,这里我是从 android-cmake 里面下载的.在使用这个toolchain文件之前,我们先要使用...
黑水县13210477354: xcode6 工程怎么添加外部库 - ?
保阮康妇: 进入工程,选择Target->Build Phases->Link Binary with libraries->+->add other,然后选择静态库的路径进行添加
黑水县13210477354: 如何在Linux下添加函数库 - ?
保阮康妇: 如何为Linux增加库 一. 静态库 在Linux下的静态库是以.a为后缀的文件.1. 建静态库 h1.c 源文件#include<stdio.h> void hello1() { printf(“the first hello!\n”); } h2.c 源文件#include<stdio.h> void hello2() { printf(“the second hello!\n”); }2.主程序 hello...
黑水县13210477354: 如何把一个编译好的静态链接库添加到vc6.0的链接库目录中??
保阮康妇: 1. 将A.LIB 添加到工程里. 工程里点右键-》添加文件 2. 在任意CPP文件或H文件里写上: #pragma comment (lib, "a.lib") 只要写一次,没有分号,必要时写全路径. 3. 改工程的属性,链接部分. 我喜欢用方法2.
黑水县13210477354: 如何适配Arm64架构的 iosAPP - IOS - ?
保阮康妇: 从iPhone 5S的A7 CPU开始到刚刚发布的iPhone 6(A8 CPU)都已经支持64-bit ARM 架构.关于64-bit的介绍详见维基百科.知乎上有很多关于苹果使用A7,A8芯片的讨论,可以参考 iPhone 6 的 Apple A8 芯片对比 Apple A7 提升明显吗?, ...
黑水县13210477354: 如何使用 Python 开发 iOS 程序 - ?
保阮康妇: 其实我们最主要解决的就是下面几件事情:在iOS App中安装Python解释器.搭建Python和objc通信的桥梁.如何配置工程并开发.如果不使用UIKit这些,那么就要使用OpenGL ES这些了,这种方式,主要是用于开发游戏的,我们这里不涉及这...