首页 > 其他分享 >Makefile练习1:静态库/动态库的生成和使用

Makefile练习1:静态库/动态库的生成和使用

时间:2023-08-27 16:33:21浏览次数:42  
标签:OBJS sub libSub 静态 练习 Makefile int add test

自己动手写下Makefile,并记录备忘。

工程目录如下

tree.jpg

一、生成静态库libAdd.a

1、头文件add.h

#include <stdio.h>

int add(int a, int b);

2、源文件add.c

#include "add.h"

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

3、Makefile

(1)入门版

libAdd.a: add.o
	ar -r libAdd.a add.o
	
add.o: add.c
	gcc -c add.c -o add.o

(2)进阶版

SOURCE      :=add.c
OBJS        :=add.o
TARGET      :=libAdd.a

CC			:=gcc
AR      :=ar

$(TARGET): $(OBJS)
	$(AR) -r $@ $^
	
$(OBJS): $(SOURCE)
	$(CC) -c $^ -o $@

二、生成动态库libSub.so

1、头文件sub.h

#include <stdio.h>

int sub(int a, int b);

2、源文件sub.c

#include "sub.h"

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

3、Makefile

(1)入门版

libSub.so: sub.o
	gcc -shared sub.o -o libSub.so
	
sub.o: sub.c
	gcc -c -fpic sub.c -o sub.o

(2)进阶版

SOURCE      :=sub.c
OBJS        :=sub.o
TARGET      :=libSub.so

CC			:=gcc
AR      :=ar

$(TARGET): $(OBJS)
	$(CC) -shared $^ -o $@ 
	
$(OBJS): $(SOURCE)
	$(CC) -c -fpic $^ -o $@

三、生成可执行程序test

1、源文件test.c

#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
	int a = 3;
	int b = 2;
	int result = 0;
	
	result = add(a, b);
	printf("a+b = %d\n", result);
	
	result = sub(a, b);
	printf("a-b = %d\n", result);
	
	return 0;
}

2、Makefile

(1)入门版

test: test.o
	gcc test.o -L./libAdd -lAdd -L./libSub -lSub -o test
test.o: test.c
	gcc -c test.c -I./libAdd -I./libSub -o test.o

(2)进阶版

SOURCE      :=test.c
OBJS        :=test.o
TARGET      :=test

CC			:=gcc
AR      :=ar

$(TARGET): $(OBJS)
	$(CC) $^ -o $@ -L./libAdd -lAdd -L./libSub -lSub
	
$(OBJS): $(SOURCE)
	$(CC) -c $^ -o $@ -I./libAdd -I./libSub

也可以像参考文献那样,进一步把需要链接的静态库、动态库信息,用变量表示。

3、运行test

#导出动态库所在的路径,其中/home/test/libSub是libSub.so所在目录
export LD_LIBRARY_PATH=/home/test/libSub:$LD_LIBRARY_PATH

#运行
./test

四、参考文献

1、使用makefile生成动态库和静态库 https://blog.csdn.net/xinyuantianzi/article/details/126069492?spm=1001.2014.3001.5506

标签:OBJS,sub,libSub,静态,练习,Makefile,int,add,test
From: https://blog.51cto.com/sannywoods/7253573

相关文章

  • Python练习:IP掩码换算
       b='1'c=len(b)whilec<9:d=b.ljust(8,'0')#两种输出格式print(f"二进制{d}相当于十进制{int(d,2)}")print("二进制%s相当于十进制%s"%(d,int(d,2)))b=b+'1'c=len(b)  ......
  • 【Land of Lisp】一次练习:巫师文本冒险游戏
    绪论CommonLisp是一门多范式语言,支持多种编程模式,包括面向对象编程、函数式编程。但CommonLisp鼓励函数式编程,并且包含有许多函数式编程相关的功能。《LandofLisp》是一本寓教于乐的学习Lisp语法的书籍。这本书配以漫画插图来进行表达,并且将小游戏的制作作为演示和练习实例......
  • 【树状数组】牛客练习赛52 B.Galahad
    【树状数组】牛客练习赛52B.Galahad题目链接:https://ac.nowcoder.com/acm/contest/1084/B题意多组询问,计算区间和,但相同的数只能被计算一次。题解离线处理询问,按右端点排序。对于相同的数字,我们只能选一个加入到区间和中,我们是枚举右端点,所以选择最靠近右端点左边的数字最......
  • Linux 静态库和动态库
    静态库和动态库在Linux中静态库以lib作为前缀,以.a作为后缀,中间是库的名字自己指定即可,即:libxxx.a在Windows中静态库一般以lib作为前缀,以lib作为后缀,中间是库的名字需要自己指定,即:libxxx.lib生成静态链接库1将源文件进行汇编,得到.o文件,需要使用参数-c$......
  • 最短路练习
    T1SightseeingCowsG我们先考虑如何求平均乐趣值。1.总乐趣为\(\sum^n_{i=1}f_i\timess_i\),其中\(f_i\)为第\(i\)个点的乐趣值,\(s_i\)表示选不选。2.路径是个环,总长度为\(\sum^n_{i=1}e_i\timess_i\)其中\(e_i\)为从点\(i\)出发所走的边。所以最大平均......
  • tmux静态链接libevent
    开发环境~✘cat/etc/issueUbuntu18.04.6LTS\n\l~✘编译步骤libevent~/prog/libevent-2.1.12-stable✘./configure--prefix=$PWD/install--enable-static~/prog/libevent-2.1.12-stable✘makeinstalltmux~/prog/tmux-3.3a✘LIBEVENT_CORE_CFLAGS......
  • 第二章总练习题
    重点习题:第3题及其应用(第4题).第5、6、7、8等题目都需要用到单调有界原理,重点把握这一重要的判断数列收敛的条件。  ......
  • java-文件复制练习
    packagecom.example.ss_0203_array.test.test_0826;importjava.io.*;publicclasstest2{publicstaticvoidmain(String[]args)throwsIOException{Filesrc=newFile("F:\\阿里云盘下载\\B站黑马java基础\\day10_字符串\\代码\\mystring");......
  • VMware Fusion Debian12虚拟机静态IP设置
    在VMwareFusion中安装了Debian12,设置静态IP后ping不通外部网络:/etc/network/interfaces配置#Thisfiledescribesthenetworkinterfacesavailableonyoursystem#andhowtoactivatethem.Formoreinformation,seeinterfaces(5).source/etc/network/int......
  • [校内] 计数练习
    0811T1计数练习题意作为一名普及组选手,小\(A\)喜欢数数。一天,小\(A\)学习了排列相关的知识。定义一个长度为\(n\)的序列\(p_{1...n}\)是一个\(n\)阶排列,当且仅当\(p_{1...n}\)都是\([1,n]\)中的正整数且它们两两不同。小\(A\)想数排列。为了让数排列更有趣,......