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

时间:2014-11-01 13:24:49

标签: c linux makefile shared-libraries

我有4个文件: 1.c 1.h 2.c 2.h 。 我需要一个makefile,它将从这4个文件创建一个动态库(.so)。 我试着写一个这样的makefile:

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

但它不起作用。如果有人帮助我,那就太棒了,谢谢。

4 个答案:

答案 0 :(得分:3)

最简单的方法是:

CXXFLAGS += -fPIC
CXXFLAGS += -O3
x.so: 1.o 2.o
    $(LINK.cc) -shared $^ $(LOADLIBS) $(LDLIBS) -o $@

略高一点:

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)

答案 1 :(得分:2)

这样的东西
 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

但这是未经测试的!我假设Linux使用GNU make,并且目录只包含库的源代码(使用上面的Makefile),这可能是不好的做法 - 你可能想要一个测试用例 - (你可能有) Makefile的特殊%.pic.o规则取决于%.c等等...)

提示:使用make -p来理解内置规则。然后make --trace或(使用remakeremake -x了解make正在做的事情。

另请阅读Drepper's paper: How to Write Shared Librariesdocumentation of GNU makeProgram Library HowTothis answer,...

答案 2 :(得分:2)

CC = gcc                                # C compiler
CFLAGS = -fPIC -Wall -Wextra -g         # C flags
LDFLAGS = -shared                       # linking flags
RM = rm -f                              # rm command
TARGET_LIB = sh_main.so                 # target lib

SRCS = add.c sub.c main.c               # source file
DEPS = header.h                         # header file
OBJS = $(SRCS:.c=.o)                    # object file

.PHONY: all
all: ${TARGET_LIB}

$(TARGET_LIB): $(OBJS)
        $(CC) ${LDFLAGS} -o $@ $^       # -o $@ says, put the output of the compilation in the file named on the left side of the :

$(SRCS:.c=.d):%.d:%.c
        $(CC) $(CFLAGS) -MM $< >$@      # the $< is the first item in the dependencies list, and the CFLAGS macro is defined as above
include $(SRCS:.c=.d)

.PHONY: clean
clean:
        -${RM} ${TARGET_LIB} ${OBJS} $(SRCS:.c=.d)

成功创建共享库之后。我们需要安装它。
成为root用户。
将共享库复制到标准目录“ / usr / lib ”。
运行 ldcofig 命令。

使用共享库重新编译.c文件。 root @ Admin:〜/ C / SharedLibrary #gcc -c main.c root @ Admin:〜/ C / SharedLibrary #gcc -o main main.o sh_main.so

root @ Admin:〜/ C / SharedLibrary# ldd main

注意:在我的情况下。
main.c:主C文件
sh_main.so:共享库。

答案 3 :(得分:0)

我不是gnu的专家,这对我来说似乎很合理

CFLAGS+=-fPIC
%.so: ; $(LINK.c) $(LDFLAGS) -shared $^ -o $@

library.so: 1.o 2.o  # default target first

# changes to `1.h` imply `1.o` needs to be rebuilt
1.o: 1.h  
2.o: 2.h