Makefile:如何在C中创建静态库和共享库?

让-巴蒂斯特·布希耶(Jean-Baptiste Bouhier)

女士们,先生们,你好。

我正在尝试用C创建一个Makefile,它将创建两个库,一个静态,一个共享。
到目前为止,我的Makefile适用于静态部分。

项目文件结构:

//root
//root/src

值得一提的是,该Makefile还在我的根项目目录和/ src目录中创建* .o。
该怎么做,它只在/ src目录中创建目标文件?

生成文件:

SNAME   =   libmy_printf_`uname -m`-`uname -s`.a
DNAME   =   libmy_printf_`uname -m`-`uname -s`.so
SRC     =   $(wildcard src/*.c)
OBJ     =   $(SRC:.c=.o)
CC      =   gcc
RM      =   rm -f
CFLAGS  =   -W -Wall -ansi -pedantic -Werror -g3 -fPIC
LDFLAGS = -L. -l$(NAME)

STATIC:     $(OBJ)
            $(CC) -c $(SRC) 
            ar r $(SNAME) $(OBJ) 
            ranlib $(SNAME)

DYNAMIC:    $(OBJ)
            $(CC) -c $(SRC)
            $(CC) -shared -o $(DNAME) $(OBJ)

.PHONY: my_printf_static
my_printf_static:       $(STATIC)

.PHONY: my_printf_dynamic
my_printf_dynamic:      $(DYNAMIC)

.PHONY: all
all:                    my_printf_static my_printf_dynamic

.PHONY: clean
clean:
                        $(RM) $(OBJ)
.PHONY: fclean
fclean:                 clean
                        $(RM) $(SNAME) $(DNAME) 
.PHONY: re
re:                     fclean all  

谢谢!

Chnossos

您的makefile可以归结为:

NAME    :=  libmy_printf_$(shell uname -m)-$(shell uname -s)
SNAME   :=  $(NAME).a
DNAME   :=  $(NAME).so
SRC     :=  $(wildcard src/*.c)
OBJ     :=  $(SRC:.c=.o)
CFLAGS  :=  -ansi -pedantic -Wall -W -Werror -g3 -fPIC
LDFLAGS :=  -L.
LDLIBS  :=  -l$(...)

.PHONY: all clean fclean re

all: $(SNAME) $(DNAME)

$(SNAME): $(OBJ)
    $(AR) $(ARFLAGS) $@ $^

$(DNAME): LDFLAGS += -shared
$(DNAME): $(OBJ)
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

clean:
    $(RM) $(OBJ)

fclean: clean
    $(RM) $(SNAME) $(DNAME)

re: fclean all

您应该知道很多事情:

  • 不要使用反引号命令,而是将$(shell)内置函数与:=赋值运算符结合使用,以防止多次重复运行命令(除非这是所需的行为)。

  • 仅使用一条.PHONY放在所有规则上方的特殊规则,然后在此处列出。

  • 重新定义$(CC)$(RM)像您所做的变量毫无意义,因为它们已经包含了您想要的内容。

  • 您已编写-l$(NAME)但未定义NAME变量。我将其更改为$(...)因为我无法在这里猜到您真正想要的是什么,所以请不要忘记处理此问题。

  • 使用要创建的目标的名称作为相关规则的名称。作出这样的方式不会重新创建目标,除非你真的想(通过调用cleanfcleanre明确的规则)。

  • -L标志和-l标志不应混入同一变量中,除非在链接命令中放置在正确的位置。实际上,您甚至没有使用它们。按照Make隐式规则,我在LDFLAGSLDLIBS内置变量中明确地将它们分开

如有任何疑问,请继续。


如注释中所述,如果需要-fPIC从静态库的编译标志中删除标志,则应考虑在不同目录中构建目标文件:

编辑:我添加了您my_printf_staticmy_printf_dynamic规则:

NAME    :=  libmy_printf_$(shell uname -m)-$(shell uname -s)
SNAME   :=  $(NAME).a
DNAME   :=  $(NAME).so
SRC     :=  $(wildcard src/*.c)
SDIR    :=  build-static
SOBJ    :=  $(SRC:src/%.c=$(SDIR)/%.o)
DDIR    :=  build-shared
DOBJ    :=  $(SRC:src/%.c=$(DDIR)/%.o)
CFLAGS  :=  -ansi -pedantic -Wall -Werror -W -g3
LDFLAGS :=  -L.
LDLIBS  :=  -l$(...)

.PHONY: all clean fclean re my_printf_static my_printf_dynamic

all: my_printf_static my_printf_dynamic

my_printf_static: $(SNAME)

my_printf_dynamic: $(DNAME)

$(SNAME): $(SOBJ)
    $(AR) $(ARFLAGS) $@ $^

$(DNAME): CFLAGS += -fPIC
$(DNAME): LDFLAGS += -shared
$(DNAME): $(DOBJ)
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(SDIR)/%.o: src/%.c | $(SDIR)
    $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $<

$(DDIR)/%.o: src/%.c | $(DDIR)
    $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $<

$(SDIR) $(DDIR):
    @mkdir $@

clean:
    $(RM) -r $(SDIR) $(DDIR)

fclean: clean
    $(RM) $(SNAME) $(DNAME)

re: fclean all

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C ++中为Android和iOS创建共享库?

来自分类Dev

如何从C源代码使用Makefile创建静态库

来自分类Dev

如何在Visual C ++中的项目之间共享代码或静态库中的静态变量的“未解析的外部符号”

来自分类Dev

从静态库列表创建共享库

来自分类Dev

如何在Linux中创建和使用动态和静态库(C编程)?

来自分类Dev

如何使用libtool从大量静态库中创建静态库

来自分类Dev

如何在makefile中包含和编译库

来自分类Dev

如何在C中创建库?

来自分类Dev

如何在橡皮筋项目中使用Makefile.ios创建静态库

来自分类Dev

共享库和与静态库的多层链接

来自分类Dev

如何在C ++中包含共享库?libORB_SLAM

来自分类Dev

如何在AOSP项目中使用预建的c ++静态/共享库

来自分类Dev

有关静态和共享库的C问题

来自分类Dev

有关静态和共享库的C问题

来自分类Dev

如何在Makefile中链接libssh库

来自分类Dev

如何在共享库中调用atexit?

来自分类Dev

如何在React中全局共享库?

来自分类Dev

如何在WAF中构建静态库?

来自分类Dev

如何在WAF中构建静态库?

来自分类Dev

如何在二进制文件中包含共享库依赖项(不使用.deb或.rpm),和/或静态链接到PulseAudio?

来自分类Dev

如何使用静态库(.a文件)而不是一组目标文件(.o)创建共享库

来自分类Dev

如何使用静态库(.a文件)而不是一组目标文件(.o)创建共享库

来自分类Dev

使用g ++从cpp文件和静态库创建共享库

来自分类Dev

构建共享库创建了一个静态库

来自分类Dev

如何通过静态库(macOS)在主进程和动态库之间共享全局变量?

来自分类Dev

如何在C ++中创建类似于stl的库

来自分类Dev

如何在Linux上创建存根共享库

来自分类Dev

从静态库构建共享库

来自分类Dev

共享库中的静态变量

Related 相关文章

  1. 1

    如何在C ++中为Android和iOS创建共享库?

  2. 2

    如何从C源代码使用Makefile创建静态库

  3. 3

    如何在Visual C ++中的项目之间共享代码或静态库中的静态变量的“未解析的外部符号”

  4. 4

    从静态库列表创建共享库

  5. 5

    如何在Linux中创建和使用动态和静态库(C编程)?

  6. 6

    如何使用libtool从大量静态库中创建静态库

  7. 7

    如何在makefile中包含和编译库

  8. 8

    如何在C中创建库?

  9. 9

    如何在橡皮筋项目中使用Makefile.ios创建静态库

  10. 10

    共享库和与静态库的多层链接

  11. 11

    如何在C ++中包含共享库?libORB_SLAM

  12. 12

    如何在AOSP项目中使用预建的c ++静态/共享库

  13. 13

    有关静态和共享库的C问题

  14. 14

    有关静态和共享库的C问题

  15. 15

    如何在Makefile中链接libssh库

  16. 16

    如何在共享库中调用atexit?

  17. 17

    如何在React中全局共享库?

  18. 18

    如何在WAF中构建静态库?

  19. 19

    如何在WAF中构建静态库?

  20. 20

    如何在二进制文件中包含共享库依赖项(不使用.deb或.rpm),和/或静态链接到PulseAudio?

  21. 21

    如何使用静态库(.a文件)而不是一组目标文件(.o)创建共享库

  22. 22

    如何使用静态库(.a文件)而不是一组目标文件(.o)创建共享库

  23. 23

    使用g ++从cpp文件和静态库创建共享库

  24. 24

    构建共享库创建了一个静态库

  25. 25

    如何通过静态库(macOS)在主进程和动态库之间共享全局变量?

  26. 26

    如何在C ++中创建类似于stl的库

  27. 27

    如何在Linux上创建存根共享库

  28. 28

    从静态库构建共享库

  29. 29

    共享库中的静态变量

热门标签

归档