如何通过Makefile生成和使用静态库与动态库?

2026-04-12 04:481阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计774个文字,预计阅读时间需要4分钟。

如何通过Makefile生成和使用静态库与动态库?

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

工程目录如下:

project/│├── src/│ ├── main.c│ └── add.c│├── include/│ └── add.h│└── lib/ └── libAdd.a

Makefile内容:

makefile定义源文件和目标文件SOURCES=src/main.c src/add.cOBJECTS=$(SOURCES:.c=.o)EXECUTABLE=project

定义编译器命令CC=gccCFLAGS=-Wall -cLDFLAGS=-Llib -lAdd

定义编译规则all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)$(CC) $(LDFLAGS) -o $@ $^

%.o: %.c$(CC) $(CFLAGS) -o $@ $<

clean:rm -f $(OBJECTS) $(EXECUTABLE)

备忘:

1.确保所有源文件和头文件在正确的目录下。

2.编译时使用`make`命令。

3.清理编译生成的中间文件和可执行文件,使用`make clean`命令。

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

工程目录如下

如何通过Makefile生成和使用静态库与动态库?

一、生成静态库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); }

(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生成动态库和静态库 blog.csdn.net/xinyuantianzi/article/details/126069492?spm=1001.2014.3001.5506

本文共计774个文字,预计阅读时间需要4分钟。

如何通过Makefile生成和使用静态库与动态库?

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

工程目录如下:

project/│├── src/│ ├── main.c│ └── add.c│├── include/│ └── add.h│└── lib/ └── libAdd.a

Makefile内容:

makefile定义源文件和目标文件SOURCES=src/main.c src/add.cOBJECTS=$(SOURCES:.c=.o)EXECUTABLE=project

定义编译器命令CC=gccCFLAGS=-Wall -cLDFLAGS=-Llib -lAdd

定义编译规则all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)$(CC) $(LDFLAGS) -o $@ $^

%.o: %.c$(CC) $(CFLAGS) -o $@ $<

clean:rm -f $(OBJECTS) $(EXECUTABLE)

备忘:

1.确保所有源文件和头文件在正确的目录下。

2.编译时使用`make`命令。

3.清理编译生成的中间文件和可执行文件,使用`make clean`命令。

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

工程目录如下

如何通过Makefile生成和使用静态库与动态库?

一、生成静态库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); }

(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生成动态库和静态库 blog.csdn.net/xinyuantianzi/article/details/126069492?spm=1001.2014.3001.5506