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
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
静态动态是在软件开发中常用的两种文件形式。下面我会分别介绍一下它们的制作过程。 1. 静态制作: 静态是在链接时被完整地复制到可执行程序中的文件,它包含了函数和数据的实现。静态的制作分为以下几个步骤: - 编写源代码并编译成目标文件(.o或.obj文件):使用编译器将源代码编译成目标文件。例如,使用 GCC 编译器可以执行以下命令:`gcc -c mylib.c -o mylib.o`。 - 将目标文件打包成静态文件:使用静态打包工具(如ar)将目标文件打包成静态文件。例如,使用 ar 工具可以执行以下命令:`ar rcs libmylib.a mylib.o`。这将生成名为 libmylib.a 的静态文件。 - 将生成的静态文件与头文件一起发布:将生成的静态文件 libmylib.a 与相关的头文件一起提供给其他开发者使用。 2. 动态制作: 动态是在运行时被动态加载的文件,它可以在多个程序之间共享动态的制作分为以下几个步骤: - 编写源代码并编译成目标文件(.o或.obj文件):同样,使用编译器将源代码编译成目标文件。例如,执行以下命令:`gcc -c -fPIC mylib.c -o mylib.o`。注意,这里加入了 `-fPIC` 参数,以生成位置无关的代码。 - 将目标文件打包成动态文件:使用动态打包工具(如gcc)将目标文件打包成动态文件。例如,执行以下命令:`gcc -shared mylib.o -o libmylib.so`。这将生成名为 libmylib.so 的动态文件。 - 将生成的动态文件与头文件一起发布:将生成的动态文件 libmylib.so 与相关的头文件一起提供给其他开发者使用。 制作完成后,其他开发者可以使用静态动态来链接到他们的程序中,以使用中提供的函数和数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值