Linux 程序 动态库 静态库依赖关系

Linux 程序 动态库 静态库依赖关系,在执行程序的时候,已经比较熟悉了,但是在编译过程中,一直还有点疑问。

比如:

1、app 依赖 动态库A,动态库A依赖静态库B

2、app 依赖 动态库A,动态库A依赖动态库B

3、app 依赖 静态库A,静态库A依赖动态库B //这种我目前没有成功,感觉实现不了

3、app 依赖 静态库A,静态库A依赖动态库B (这种可以实现,只是在编译app的时候需要依赖AB库)

4、app 依赖 静态库A,静态库A依赖静态库B

针对情况1:

编译的时候,先编译静态库B,编译静态库B的时候,加上 -shared -fPIC参数

然后编译动态库A的时候,让动态库A依赖静态库B      //这样可以把静态库编译进动态库里面

然后编译app的时候,只依赖动态库A就可以了

程序执行的时候,app就只依赖动态库A。

注:在编译动态库A的时候,可以选择不依赖静态库B。只是这样在编译app的时候,app需要同时依赖动态库A和静态库B。且动态库必须在静态库的前面。

针对情况2:

编译的时候,分别编译动态库A和B。动态库A和B的编译顺序可以任意,两者是独立的。

编译app的时候,依赖动态库A和B。这个时候动态库A必须在动态库B的前面。比如:

gcc -o test main.c -L./ -lfun_A -lfun_B

针对情况3:

这种情况无法实现。静态库无法依赖动态库。

针对情况4:

和情况二一致。

编译的时候,分别编译静态库A和B。静态库A和B的编译顺序可以任意,两者是独立的。

编译app的时候,依赖静态库A和B。这个时候静态库A必须在动态库B的前面。比如:

gcc -o test main.c -L./ -lfun_A -lfun_B

涉及到的代码如下:

.
├── fun_1.c
├── fun_1.h
├── fun_2.c
├── fun_2.h
├── main.c
├── make_app_share_share.sh
├── make_app_share_static.sh
├── make_app_static_static.sh
└── readme.txt
注:之前说到的A和B分别对应2和1.即fun_2依赖fun_1

fun_1.c  

#include 

int fun1(void)
{
    printf("this is fun1.\n");
    return 0;
}

fun_1.h  

#ifndef _FUN_1_
#define _FUN_1_
int fun1(void);

#endif

fun_2.c  

#include 
#include "fun_1.h"

int fun2(void)
{
    printf("this is fun2.Immediately call fun1.\n");
    fun1();

    return 0;
}

fun_2.h  

#ifndef _FUN_2_
#define _FUN_2_

int fun2(void);

#endif

main.c  

#include 
#include "fun_2.h"

int main()
{
    printf("this is main.\n");
    fun2();

    return 0;
}

make_app_share_share.sh  

#!/bin/bash

#先编译生成动态库
gcc -o libfun_1.so fun_1.c -shared -fPIC

gcc -o libfun_2.so fun_2.c -shared -fPIC 

gcc -o app_share_share main.c -L./ -lfun_2 -lfun_1

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./
./app_share_share

rm app_share_share libfun_1.so libfun_2.so

make_app_share_static.sh  

#!/bin/bash
#app依赖动态库,动态库依赖静态库

#先编译生成静态库
#gcc -o fun_1.o -c fun_1.c -shared -fPIC
gcc -o fun_1.o -c fun_1.c
ar -r libfun_1.a  fun_1.o    

gcc -o libfun_2.so fun_2.c  -shared -fPIC -L./ -lfun_1

gcc main.c -o app_share_static -L./ -lfun_2

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./
./app_share_static

rm libfun_1.a  fun_1.o libfun_2.so app_share_static

make_app_static_static.sh  

#!/bin/bash
#app依赖动态库,动态库依赖静态库

#先编译生成静态库
gcc -o fun_1.o -c fun_1.c -shared -fPIC     #推荐这种方式编译静态库
#gcc -o fun_1.o -c fun_1.c                  #不推荐这种方式编译静态库
ar -r libfun_1.a  fun_1.o    


gcc -o fun_2.o -c fun_2.c -shared -fPIC
ar -r libfun_2.a  fun_2.o    

gcc main.c -o app_static_static -L./ -lfun_2 -lfun_1

./app_static_static

rm libfun_1.a  fun_1.o libfun_2.a fun_2.o app_static_static

readme.txt

对应的源码下载链接:https://download.csdn.net/download/a3121772305/85116199

你可能感兴趣的:(程序编译,程序,动态库,静态库,依赖问题)