use*_*733 5 c linux makefile shared-libraries
我有4个文件:1.C,升·小时,2.C,2.H。我需要一个生成文件,它将从这 4 个文件创建一个动态库 (.so)。我试图写一个这样的makefile:
library.so : 1.c 1.h 2.c 2.h
但它没有用。如果有人帮助我,那就太好了,谢谢。
就像是
CC=gcc
CFLAGS= -Wall -g -O -fPIC
RM= rm -f
.PHONY: all clean
all: library.so
clean:
$(RM) *.o *.so
library.so: 1.o 2.o
$(LINK.c) -shared $^ -o $@
1.o: 1.c 1.h 2.h
2.o: 2.c 1.h 2.h
Run Code Online (Sandbox Code Playgroud)
但这是未经测试的!我假设 Linux 带有GNU make,以及一个仅包含您的库的源代码的目录(上面的Makefile),这可能是不好的做法 - 你可能需要一个测试用例 - (你可以有一个特殊的Makefile规则来%.pic.o依赖%.c等等...)
提示:用于make -p理解内置规则。然后make --trace或(使用remake)remake -x了解更多make 正在做什么。
另请阅读Drepper 的论文:How to Write Shared Libraries、GNU make 文档、Program Library HowTo、这个答案,...
最简单的方法是:
CXXFLAGS += -fPIC
CXXFLAGS += -O3
x.so: 1.o 2.o
$(LINK.cc) -shared $^ $(LOADLIBS) $(LDLIBS) -o $@
Run Code Online (Sandbox Code Playgroud)
稍微高级一点:
CC = gcc
FLAGS = # -std=gnu99 -Iinclude
CFLAGS = -fPIC -g #-pedantic -Wall -Wextra -ggdb3
LDFLAGS = -shared
DEBUGFLAGS = -O0 -D _DEBUG
RELEASEFLAGS = -O2 -D NDEBUG -combine -fwhole-program
TARGET = example.so
SOURCES = $(wildcard *.c)
HEADERS = $(wildcard *.h)
OBJECTS = $(SOURCES:.c=.o)
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(FLAGS) $(CFLAGS) $(DEBUGFLAGS) -o $(TARGET) $(OBJECTS)
Run Code Online (Sandbox Code Playgroud)