Linux 库文件

静态库

静态库在链接时,会将依赖的库编到二进制中,产生的二进制文件比较大。
举例如下:

// add.c
int add(int i, int j)
{
    return i + j ;
}

编译a.c

gcc -c add.c -o add.o

构建静态库

ar rcs libadd.a add.o

主文件

// main.c
#include 
int add(int, int);

int main()
{
    int i = add (100,1000);
    printf("i:%d.\n", i);
    return 0;
}

编译主文件

[test]gcc main.c -ladd -L.
[test]$ ./a.out
i:1100.
[test]$ nm a.out  | grep add
0000000000400552 T add 	# T 表示该符号在文件中定义
[test]$

动态库

仍然以 a.c 为例,构建动态库

[test]gcc -shared -fPIC add.c -o libadd.so
[test]gcc main.c -ladd -L.
[test]export LD_LIBRARY_PATH=动态库所在目录
[test]$ ./a.out
i:1100.
[test]$

注意 -ladd 即可以链接libadd.a也可以链接libadd.so。 若两者同时存在,则优先动态库libadd.so

静态库之间的依赖关系

假设liba.a依赖llibb.a,链接时是需要先指定 -la, 再指定-lb
举例如下:

// a.c
int b();
int a()
{
    return b();
}

// b.c
int b()
{
    return 100;
}


// main.c
int a();
int main()
{
    int i = a();
    return 0;
}

[test]$ gcc main.c -lb -la -L.
./liba.a(a.o):在函数‘a’中:
a.c:(.text+0xa):对‘b’未定义的引用
collect2: 错误:ld 返回 1
// 注意: -lb -la 时 会报a.o中对b未定义,
// 指定 -la -lb 如下
[test]$ gcc main.c -la -lb -L.
[test]$ ./a.out
[test]$
// -la -lb 则可以链接

总结: 若liba.a依赖libb.a,则链接时必须指定-la -lb这种顺序, 否则会报错。

你可能感兴趣的:(c++,C,linux,运维,服务器)