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 <stdio.h>
#define STATIC_LIB "this is static lib"
int static_lib(void);
int static_lib2(void);
/*************static.h*******************/
//static.c
/*************static.c*******************/
#include <stdio.h>
#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 <stdio.h>
#define SHARE_LIB "this is share lib"
int share_lib(void);
/*************share.h*******************/
//share.c
/*************share.c*******************/
#include <stdio.h>
#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 <stdio.h>
#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 //这里说明会把静态库全部编译进动态库里面
*/