用于从现有文件创建 (.so) 文件的 makefile

use*_*733 5 c linux makefile shared-libraries

我有4个文件:1.C升·小时2.C2.H。我需要一个生成文件,它将从这 4 个文件创建一个动态库 (.so)。我试图写一个这样的makefile:

library.so : 1.c 1.h 2.c 2.h

但它没有用。如果有人帮助我,那就太好了,谢谢。

Bas*_*tch 8

就像是

 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或(使用remakeremake -x了解更多make 正在做什么。

另请阅读Drepper 的论文:How to Write Shared LibrariesGNU make 文档Program Library HowTo这个答案,...


4pi*_*ie0 7

最简单的方法是:

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)