gpt4 book ai didi

linux - make for compiling — 项目文件夹和子文件夹中的所有 *.c 文件

转载 作者:可可西里 更新时间:2023-11-01 11:46:24 25 4
gpt4 key购买 nike

为了编译两个文件,我创建了一个 makefile,我可以在其中提及对象名称,或者我可以使用 patsubst 使用模式规则。

# ----------------------------------------------------------------------------
# Makefile for building tapp
#
# Copyright 2010 FriendlyARM (http://www.arm9.net/)
#

ifndef DESTDIR
DESTDIR ?= /opt/FriendlyARM/tiny6410/linux/rootfs_qtopia_qt4
endif

#CFLAGS = -c -Wall -O2 # wall is for warning show and 02 is optiminisation level 2
CFLAGS = -c -O2 # wall is for warning show and 02 is optiminisation level 2
#CC = arm-linux-gcc # compiler name
CC = gcc # compiler name
LD = ld

INSTALL = install #

TARGET = led_player_project

#OBJ = led-player_backup.o led-player.o
OBJ := $(patsubst %.c,%.o,$(wildcard *.c */*.c))

#OBJ = $(shell find . -name '*.c')

all: $(TARGET)
#all: $(OBJ)

led_player_project : $(OBJ)
$(LD) $(LDFLAGS) -o $@ $(OBJ) $(LIBS)
# $(LD) $(LDFLAGS) -o $@ $< $(LIBS)

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

#$< -o $@


install: $(TARGET)
$(INSTALL) $^ $(DESTDIR)/usr/bin

clean :
rm -rf *.o $(TARGET) $(OBJ)


# ----------------------------------------------------------------------------

.PHONY: $(PHONY) install clean

# End of file
# vim: syntax=make

#EOF

现在如果我的项目包含文件夹包含子文件夹并且它们包含更多文件。那么我可以编写模式规则来编译每个文件并创建一个通用的可执行文件吗?

1> 我是否必须在每个子文件夹中创建 makefile,以便我可以从主 makefile 调用该 makefile,例如将静态驱动程序集成到 linux 内核中,每个驱动程序都有各自的 makefile?
2> 还是整个项目的通用 makefile?
3> 我可以使用 patsubst 来编译每个文件而不提及名称吗?
4> 我如何组合每个 *.o 来创建名为 main 的可执行文件。

enter image description here

编辑:---
@简·胡德克我已根据您的评论修改了我的 makefile(我已在上面发布)。现在我只是尝试在我的主文件夹中使用两个文件夹。我收到以下错误文件夹结构:--

main Folder  ----> one Folder 
----> two Folder

文件夹主要包含:--

main.c 
main.h
Makefile

文件夹一包含:--

one.c
one.h

文件夹二包含:--

two.c
two.h

main.c 内容:--

#include <stdio.h>
#include <stdlib.h>

#include "main.h"

int main()
{
char *p;

printf("\n\n main \n");

one();
two();

return 0;
}

main.h 内容:---

#include "one/one.h"
#include "two/two.h"

one.c 内容:---

    #include <stdio.h>
#include <stdlib.h>

#include "one.h"

void one()
{

printf("\n one \n");

}

one.h内容:---

void one();

two.c内容:---

#include <stdio.h>
#include <stdlib.h>

#include "two.h"

void two()
{

printf("\n two \n");

}

two.h内容:---

void two();

我在制作时遇到的错误:----

ignite@ignite:~/testing/main$ make
gcc -c -O2 main.c -o main.o
gcc -c -O2 one/one.c -o one/one.o
gcc -c -O2 two/two.c -o two/two.o
ld -o led_player_project main.o one/one.o two/two.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080
main.o: In function `main':
main.c:(.text.startup+0x11): undefined reference to `puts'
one/one.o: In function `one':
one.c:(.text+0xb): undefined reference to `puts'
two/two.o: In function `two':
two.c:(.text+0xb): undefined reference to `puts'
make: *** [led_player_project] Error 1
ignite@ignite:~/testing/main$

最佳答案

广告 1 和 2:文件名可以安全地包含目录,并且 % 根据需要匹配 /。因此,您可以轻松拥有:

$(wildcard subdir/*.c) $(wildcard anotherdir/*.c)

甚至

$(wildcard */*.c)

...或者按照 keltar 在评论中的建议

$(shell find . -name '*.c')

这是递归的。

广告 3:你在做。

广告 4:创建一个以 $(OBJ) 作为依赖项的目标,并像编译时一样使用自动变量:

main : $(OBJ)
$(LD) $(LDFLAGS) -o $@ $< $(LIBS)

关于linux - make for compiling — 项目文件夹和子文件夹中的所有 *.c 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19539422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com