GCC多文件编译静态库和共享库(动态库)

测试环境及工具

  • Ubuntu 16.04
  • gcc version 5.4.0 20160609
  • ar (GNU Binutils for Ubuntu) 2.26.1

测试源码

测试目录

├── include
│   └── head.h
├── lib
├── main.c
└── src
    ├── add.c
    ├── div.c
    ├── mul.c
    └── sub.c

源文件

head.h

int add(int a,int b);
int sub(int a,int b);
int mul(int a,int b);
int div(int a,int b);

main.c

#include <stdio.h>
#include "include/head.h"

int main(int argc, char const *argv[])
{
	int a=12;
	int b=4;
	printf("%d+%d=%d\n",a,b,add(a,b));
	printf("%d-%d=%d\n",a,b,sub(a,b));
	printf("%d*%d=%d\n",a,b,mul(a,b));
	printf("%d/%d=%d\n",a,b,div(a,b));
	return 0;
}

add.c

#include "head.h"

int add(int a,int b){
	return a+b;
}

sub.c

#include "head.h"

int sub(int a,int b){
	return a-b;
}

mul.c

#include "head.h"

int mul(int a,int b){
	return a*b;
}

div.c

#include "head.h"

int div(int a,int b){
	return a/b;
}

静态库

静态库命名方式:lib+库名,静态库的后缀为".a"。

编译过程

ubuntu@ubuntu:~/Desktop/test$ cd src
ubuntu@ubuntu:~/Desktop/test/src$ ls
add.c  div.c  mul.c  sub.c
ubuntu@ubuntu:~/Desktop/test/src$ gcc *.c -I ../include -c
ubuntu@ubuntu:~/Desktop/test/src$ ls
add.c  add.o  div.c  div.o  mul.c  mul.o  sub.c  sub.o
ubuntu@ubuntu:~/Desktop/test/src$ ar rcs -o libtest.a *.o
ubuntu@ubuntu:~/Desktop/test/src$ ls
add.c  add.o  div.c  div.o  libtest.a  mul.c  mul.o  sub.c  sub.o
ubuntu@ubuntu:~/Desktop/test/src$ mv libtest.a ../lib/
ubuntu@ubuntu:~/Desktop/test/src$ cd ../
ubuntu@ubuntu:~/Desktop/test$ ls lib/
libtest.a
ubuntu@ubuntu:~/Desktop/test$ gcc main.c -L lib -l test -o main
ubuntu@ubuntu:~/Desktop/test$ ./main
12+4=16
12-4=8
12*4=48
12/4=3

共享库(动态库)

共享库命名方式:lib+库名,共享库的后缀为".so"。

编译过程

ubuntu@ubuntu:~/Desktop/test$ cd src
ubuntu@ubuntu:~/Desktop/test/src$ ls
add.c  add.o  div.c  div.o  mul.c  mul.o  sub.c  sub.o
ubuntu@ubuntu:~/Desktop/test/src$ rm *.o
ubuntu@ubuntu:~/Desktop/test/src$ ls
add.c  div.c  mul.c  sub.c
ubuntu@ubuntu:~/Desktop/test/src$ gcc *.c -fPIC -c -I ../include/
ubuntu@ubuntu:~/Desktop/test/src$ ls
add.c  add.o  div.c  div.o  mul.c  mul.o  sub.c  sub.o
ubuntu@ubuntu:~/Desktop/test/src$ gcc -shared *.o -o libtest.so
ubuntu@ubuntu:~/Desktop/test/src$ ls
add.c  add.o  div.c  div.o  libtest.so  mul.c  mul.o  sub.c  sub.o
ubuntu@ubuntu:~/Desktop/test/src$ mv libtest.so ../lib/
ubuntu@ubuntu:~/Desktop/test/src$ cd ..
ubuntu@ubuntu:~/Desktop/test$ ls lib/
libtest.a  libtest.so
ubuntu@ubuntu:~/Desktop/test$ gcc main.c -L lib/ -l test -o main1 
ubuntu@ubuntu:~/Desktop/test$ ./main1
./main1: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
ubuntu@ubuntu:~/Desktop/test$ ldd main1
	linux-vdso.so.1 =>  (0x00007ffe51faf000)
	libtest.so => not found
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe47414f000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fe474519000)
ubuntu@ubuntu:~/Desktop/test$ export LD_LIBRARY_PATH=./lib/
ubuntu@ubuntu:~/Desktop/test$ ldd main1
	linux-vdso.so.1 =>  (0x00007ffda9b42000)
	libtest.so => ./lib/libtest.so (0x00007f74bffbd000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f74bfbf3000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f74c01bf000)
ubuntu@ubuntu:~/Desktop/test$ ./main1
12+4=16
12-4=8
12*4=48
12/4=3

猜你喜欢

转载自blog.csdn.net/z190814412/article/details/86318756
今日推荐