Linux编译动态库 静态库

Linux 编译生成库文件的命令
将 share.c 编译生成一个动态库

    gcc share.c -o libshared.so -shared -fPIC

将    static.c 编译生成一个静态库
    方式一:

        gcc -o static.o -c static.c
        ar -r libstatic.a  static.o    

    方式二:

        gcc -o static.o -c static.c -shared -fPIC
        ar -r libstatic.a  static.o    


    注:方式二有一定的好处:
        如果你的动态库 libshared.so 调用了 静态库 libstatic.a 里面的接口,
        那么你编译动态库的时候,会把静态库编译进动态库里面。
        gcc -o libshared.so share.c  -shared -fPIC -L./ -lstatic
        如果你的动态库 libshared.so 没有调用 静态库 libstatic.a 里面的接口,
        那么你即使编译动态库的时候加上静态库选项,静态库也不会被编译进去。
        如果你编译静态库时没有加  -shared -fPIC,那么你就无法把静态库编译到动态库里面
 

代码及验证方法如下:

/*************static.h*******************/
#include 

#define STATIC_LIB "this is static lib"
int static_lib(void);
int static_lib2(void);
/*************static.h*******************/


//static.c  
/*************static.c*******************/
#include 
#include "static.h"

int static_lib(void)
{
        printf(STATIC_LIB"\n");
        return 0;
}

int static_lib2(void)
{
        printf(STATIC_LIB"222222222\n");
        return 0;
}
/*************static.c*******************/


//share.h
/*************share.h*******************/
#include 

#define SHARE_LIB "this is share lib"
int share_lib(void);
/*************share.h*******************/


//share.c 
/*************share.c*******************/
#include 
#include "share.h"
#include "static.h"

int share_lib(void)
{
        printf(SHARE_LIB"\n");
        static_lib();        //调用静态库接口,这样可以把静态库编译到动态库里面来
        return 0;
}
/*************share.c*******************/


//main.c 
/*************main.c*******************/
#include 
#include "share.h"
#include "static.h"

int main(int argc, char *argv[])
{
        share_lib();        //调用动态库接口
        static_lib();        //调用静态库接口进行验证
        static_lib2();        //调用静态库接口进行验证
        return 0;
}
/*************main.c*******************/

/*
编译步骤:
编译生成静态库
gcc -o static.o -c static.c -shared -fPIC
ar -r libstatic.a  static.o	

编译生成动态库
gcc -o libshared.so share.c  -shared -fPIC -L./ -lstatic

编译生成main程序 这里只链接了动态库
gcc main.c -o main -L./ -lshared

配置环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:your_path

执行main程序
./main

程序输出 动态库里面和main程序里面都成功调用了静态库的接口
this is share lib
this is static lib
this is static lib
this is static lib222222222    //这里说明会把静态库全部编译进动态库里面

*/

你可能感兴趣的:(UNIX环境高级编程,linux)