Linux环境下动态库和静态库的编译调用

实验环境

操作系统:Ubuntu 16.04

gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)

源程序:hello.c、hello.h、star.c、starfun.h。starfun.h里面有star1函数和star2函数,我们不关心函数的功能,只要记得有star1和star2两个基本函数供其他函数调用。

/*****starfun.h*****/
#include <stdio.h>
#ifndef STARFUN_H
#define STARFUN_H
#define  NUM 4
#define  NUMBER 3
int star1() {
	int i,j,k;
	for(k=1;k<=NUM;++k) {
		for(i=1;i<=(NUM-k);++i)
			printf(" ");
		for(j=1;j<=(2*k-1);++j)
			printf("*");
  		printf("\n");
	}
	return 0;
}

int star2() {
	int i,j,k;
	for(k=NUMBER;k>=0;--k)  {
		for(i=1;i<=(NUMBER-k+1);++i)
           		printf(" ");
		for(j=1;j<=(2*k-1);++j)
			printf("*");
		printf("\n");
	}
	return 0;
}
#endif

hello.h自己定义了一个hello函数,并调用star1函数

/*hello.h*/
#include "starfun.h"
#ifndef  HELLO_H
#define  HELLO_H
void hello()   {
	star1();
	printf("hello,my friends\n");
}
#endif

hello.c内实现了showhello函数

/*hello.c*/
void showhello()  {
	hello();
}

主函数在star.c

/*star.c*/
#include "hello.h"
#include <stdio.h>
int main() {
	star1();
	star2();
	showhello();
	return 0;
}

下面把hello.c分别编译成动态库和静态库供star.c调用

动态库编译和调用

gcc -c -fpic hello.c	#生成目标文件hello.o
gcc -s -shared -o libhello.so hello.o	#生成动态库文件
sudo cp libhello.so /usr/lib	#拷贝动态库文件到/usr/lib
gcc star.c -l hello -o star	#生成最终的可执行程序star,注意star.c的位置在动态库前面
运行结果

静态库的编译和调用

ar -rc -o libhello.a hello.o	#根据已生成的hello.o生成libhello.a
gcc star.c libhello.a -o star	#调用libhello.a生成star

运行结果同上