动态库与静态库的异同、生成和使用详解

下面表格实例中,实现了把test模块分别生成动态库(libtest.so)和静态库(libtest.a),并使用了生成的库。详情和注解如下:

 

类型生成使用异同其他
动态库(.so格式)

1.先编译成.o文件:

gcc -c test.c -o test.o;

2.封装成动态库:

gcc -share -fPCI -o libtest.so test.o

法一:

gcc -o test main.c -L. -ltest;(见注解A); 

1.动态函数库在编译的时候并没有被编译进目标代码中,

你的程序执行到相关函数时才调用该函数库里的相应函数,

因此动态函数库所产生的可执行文件比较小。

由于函数库没有被整合进你的程序,而是程序运行时动态的

申请并调用,所以程序的运行环境中必须提供相应的库。

2.动态库内可嵌套使用多层的静态和动态库;

动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。

 
静态库(.a格式)

1.同上;

2.封装成静态库:

ar crv libtest.a test.o;

法一:同上;

法二:

gcc main.c libtest.a -o test

1.利用静态函数库编译成的文件比较大,因为整个 函数库的

所有数据都会被整合进目标代码中,他的优点就显而易见了,

即编译后的执行程序不需要外部的函数库支持,因为所有使

用的函数都已经被编译进去了。当然这也会成为他的缺点,

2.静态库内不能嵌套使用静态或动态库

如果静态函数库改变了,那么你的程序必须重新编译。

 

注解:

test.c     -----测试功能模块的c文件

test.h     -----测试功能模块的头文件

main.c   -----include“test.h”的主函数文件

-share   -----该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。

               相当于一个可执行文件。

-fPCI      -----表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不

               能达到真正代码段共 享的目的。

 

注解A:在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明静态库名,gcc 将会从静态库中

         将公用函数连接到目标文件中。注意,gcc 会在静态库名前加上前缀 lib,然后追加扩展名.a 得到的静态库文件名来查找静态库文件。

http://blog.csdn.net/kaloha3/article/details/8258723

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS 静态库自动打包,使用 shellcmd 脚本如何写 # 获取脚本所在目录 filepath=$(cd "$(dirname "$0")"; pwd)"/" cd $filepath cd .. # 工程target,主要配置这个target即可 targetname="SafeToolSDK" # 工程目录(默认工程目录在脚本目录的上一级目录) projectdir=$(pwd)"/" echo $projectdir # 工程名 projectname="SafeToolSDK.xcodeproj" # lib输出目录 buildDir=$filepath echo $buildDir #lib输出名 libname=$targetname iossdknum=$(xcodebuild -showsdks | grep iphoneos | grep -Eo '[0-9.]+' | sed -n '1p') configurationname="Release" mydir=$filepath$libname"/" rm -rf $mydir mkdir $mydir # arm64 archname="arm64" lib64=$libname"64" echo "archname:$archname" xcodebuild -project $projectdir$projectname -configuration $configurationname -target $targetname -sdk "iphoneos$iossdknum" -arch $archname BUILD_DIR=$buildDir clean xcodebuild -project $projectdir$projectname -configuration $configurationname -target $targetname -sdk "iphoneos$iossdknum" -arch $archname BUILD_DIR=$buildDir libpath=$buildDir"/Release-iphoneos/"$libname".framework" lib64path=$mydir$lib64 mv -f $libpath"/"$libname $lib64path # armv7 archname="armv7" libv7=$libname"v7" echo "archname:$archname" xcodebuild -project $projectdir$projectname -configuration $configurationname -target $targetname -sdk "iphoneos$iossdknum" -arch $archname BUILD_DIR=$buildDir clean xcodebuild -project $projectdir$projectname -configuration $configurationname -target $targetname -sdk "iphoneos$iossdknum" -arch $archname BUILD_DIR=$buildDir libpath=$buildDir"/Release-iphoneos/"$libname".framework" libv7path=$mydir$libv7 mv -f $libpath"/"$libname $libv7path # armv7s archname="armv7s" libv7s=$libname"v7s" echo "archname:$archname" xcodebuild -project $projectdir$projectname -configuration $configurationname -target $targetname -sdk "iphoneos$iossdknum" -arch $archname BUILD_DIR=$buildDir clean xcodebuild -project $projectdir$projectname -configuration $configurationname -target $targetname -sdk "iphoneos$iossdknum" -arch $archname BUILD_DIR=$buildDir libpath=$buildDir"/Release-iphoneos/"$libname".framework" lib
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值