Linux C动态库与静态库的编译与调用(包含ar 指令说明和交叉编译应用)

注:如果是交叉编译酒用CROSS_COMPILE 中的选项进行编译

1、编译动态库

2、编译静态库

3、静态编译和动态编译

动态编译:gcc hello.c -o hello_dynamic          静态编译:gcc hello.c -o hello_static -static

Linux-C动态库与静态库的编译与调用
一、简述

          记录-Linux-C动态库与静态库的编译与调用。将实现某部分功能的代码封装成库文件,以方便调用,或者是对代码进行保护加密。应用场景:有时想将某代码提供给别人用,但是又不想公开源代码,这时可以将代码封装成库文件。在开发中调用其他人员编写的库。

      动态库特点:
        1,库的代码不会编译进程序里面,所以动态库编译的程序比较小。
        2,由动态库编译的程序依赖于系统的环境变量有没有这个库文件,没有则运行不了。

     静态库特点:
        1,库的代码会编译进程序里面,所以静态库编译的程序比较大
        2,由静态库编译的程序不用依赖于系统的环境变量,所以环境变量有没有这个库文件,也可以运行。
 

二、动态库的编译与调用

       1、创建目录:mkdir dynamic;进入dynamic目录:cd dynamic;新建c文件:vi func.c

               

       2、编辑func.c内容如下,(记得保存)

              

       3、 将func.c编译为动态库,编译命令:

            gcc func.c -o func.o -c -fPIC
            gcc func.o -shared -o libfunc.so               (注其中libfunc.so,lib为前缀,.so是后缀,中间func是库的名字)

               

       4、 在dynamic路径下新建main.c文件:vi main.c;在main.c中调用动态库中的func()函数。

              

       5、    因为fun.c与main.c在同一路径,避免干扰,删除fun.c,func.o文件;命令:rm func.c func.o

             

      6、    编译main.c并调用动态库libfunc.so。命令:gcc main.c -o main -L 库的路径 -l 库名    

              gcc main.c -o main -L . -l func            (点代表当前路径)

             

      7、   执行main,找不到库

              

       8、 需要将动态库拷贝一份到/usr/lib/路径下,命令:sudo cp libfunc.so /usr/lib     (需要超级权限);执行:./main

              

三、静态库的编译与调用

        1、创建目录:mkdir static;进入static目录:cd static;新建c文件:vi func.c

              

        2、编辑func.c内容如下,(记得保存)      

              

     3、 将func.c编译为静库,编译命令:

            gcc func.c -o func.o -c 
            ar -crv libfunc.a func.o               (注lib为前缀,静态库以.a为后缀,中间部分func为库的名字)

            

     4、 在static路径下新建main.c文件:vi main.c;在main.c中调用静态库中的func()函数。

            

     5、    因为fun.c与main.c在同一路径,避免干扰,删除fun.c,func.o文件;命令:rm func.c func.o

           

     6、 编译main.c并调用静态库libfunc.so。命令:gcc main.c -o main -L 库的路径 -l 库名    

            gcc main.c -o main -L . -l func            (点代表当前路径)

          

     7、执行:./main          (不需要将静态库拷贝到/usr/lib/)

          

   四、静态编译

        我们通常用的是动态编译,比如说调用标准库的printf()函数,printf()的代码不会直接全部的编译到可执行文件,而是相当于在可执行程序中链接调用printf()函数。这样可执行文件的大小就不会很大,但是可执行程序的运行环境必需要含有其所需要的库文件等。静态编译,就是将程序所调用到的代码全部编译到可执行文件,所以编译出来的可执行文件比较大,但是它无需过多依赖运行环境。

        比如在桌面创建hello.c;命令:vi hello.c 。编辑内容如图

        

        动态编译:gcc hello.c -o hello_dynamic          静态编译:gcc hello.c -o hello_static -static

       

ar 知识
1.ar基本用法
  ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。
  下面是ar命令的格式:
  ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...
  例如我们可以用ar rv libtest.a hello.o hello1.o来
生成一个库,库名字是test,链接时可以用-ltest链接。该库中存放了两个模块hello.o和hello1.o。选项前可以有‘-'字符,也可以
没有。下面我们来看看命令的操作选项和任选项。现在我们把{dmpqrtx}部分称为操作选项,而[abcfilNoPsSuvV]部分称为任选项。

补充说明:ar可让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限。

参  数:
指令参数
-d  删除库文件中的成员文件。
-m  变更成员文件在库文件中的次序。
-p  显示库文件中的成员文件内容。
-q  将问家附加在库文件末端。
-r  将文件插入库文件中。
-t  显示库文件中所包含的文件。
-x  自库文件中取出成员文件。
选项参数
a<成员文件>  将文件插入库文件中指定的成员文件之后。
b<成员文件>  将文件插入库文件中指定的成员文件之前。
c  建立库文件。
f  为避免过长的文件名不兼容于其他系统的ar指令指令,因此可利用此参数,截掉要放入库文件中过长的成员文件名称。
i<成员文件>  将问家插入库文件中指定的成员文件之前。
o  保留库文件中文件的日期。
s  若库文件中包含了对象模式,可利用此参数建立备存文件的符号表。
S  不产生符号表。
u  只将日期较新文件插入库文件中。
v  程序执行时显示详细的信息。
V  显示版本信息。

ar用来管理一种文档。这种文档中可以包含多个其他任意类别的文件。这些被包含的文件叫做这个文档的成员。ar用来向这种文档中添加、删除、解出成员。成员的原有属性(权限、属主、日期等)不会丢失。

实际上通常只有在开发中的目标连接库是这种格式的,所以尽管不是,我们基本可以认为ar是用来操作这种目标链接库(.a文件)的。

ar的常用用法见正文。

1、创建库文件

我 不知道怎么创建一个空的库文件。好在这个功能好像不是很需要。通常人们使用“ar cru liba.a a.o"这样的命令来创建一个库并把a.o添加进去。"c"关键字告诉ar需要创建一个新库文件,如果没有指定这个标志则ar会创建一个文件,同时会给出 一个提示信息,"u"用来告诉ar如果a.o比库中的同名成员要新,则用新的a.o替换原来的。但是我发现这个参数也是可有可无的,可能是不同版本的ar 行为不一样吧。实际上用"ar -r liba.a a.o"在freebsd5上面始终可以成功。

2、加入新成员

使用"ar -r liba.a b.o"即可以将b.o加入到liba.a中。默认的加入方式为append,即加在库的末尾。"r"关键字可以有三个修饰符"a", "b"和"i"。

  • "a"表示after,即将新成员加在指定成员之后。例如"ar -ra a.c liba.a b.c"表示将b.c加入liba.a并放在已有成员a.c之后;
  • "b"表示before,即将新成员加在指定成员之前。例如"ar -rb a.c liba.a b.c";
  • "i"表示insert,跟"b"作用相同。

3、列出库中已有成员

"ar -t liba.a"即可。如果加上"v"修饰符则会一并列出成员的日期等属性。

4、删除库中成员

"ar -d liba.a a.c"表示从库中删除a.c成员。如果库中没有这个成员ar也不会给出提示。如果需要列出被删除的成员或者成员不存在的信息,就加上"v"修饰符。

5、从库中解出成员

"ar -x liba.a b.c"

6、调整库中成员的顺序

使用"m"关键字。与"r"关键字一样,它也有3个修饰符"a","b", "i"。如果要将b.c移动到a.c之前,则使用"ar -mb a.c liba.a b.c"

 


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值