Linux-------动态库与静态库

    技术2025-09-19  10

    静态库——函数和数据被编译进一个二进制文件(扩展名问.lib)。在使用静态库的情况下,在编译连接可执行文件时,连接器从库中复制这些函数和数据并把他们和应用程序的其他模块组合起来创建最终的可执行文件(.exe)文件,当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。

    动态库——在使用动态库时,往往提供两个文件:一个引入库(.lib)文件和一个DLL(.dll)文件。虽然引入库的后缀名也是".lib",但是,动态库的引入库文件和静态库文件有着本质的区别。对一个dll来说,器引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据,在使用动态库的情况下,在编译连接和执行文件时,只需要在连接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需要的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。这时,在发布产品时,除了发布可执行文件以外,同时还要发布该程序将要调用的动态连接库。

    静态库和动态库的区别,请点击!



    转载:请点击查看!

    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

           

     

    =====================以下回复 star火 =================

    在CentOS6.9测试的效果。尝试设置export LD_LIBRARY_PATH=/yourlibpath/:$LD_LIBRARY_PATH

    其中yourlibpath是libfunc.so的存放路径。

    Processed: 0.010, SQL: 9