linux – make for compiling – 项目中文件夹和子文件夹中的所有* .c文件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – make for compiling – 项目中文件夹和子文件夹中的所有* .c文件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3349字,纯文字阅读大概需要5分钟。
内容图文
![linux – make for compiling – 项目中文件夹和子文件夹中的所有* .c文件](/upload/InfoBanner/zyjiaocheng/954/9a9bbc108dd1406cad4489adc2f4d0fe.jpg)
要编译两个文件,我创建了一个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 GT;我是否必须在每个子文件夹中创建makefile,以便我可以从主makefile调用该makefile,比如将静态驱动程序集成到linux内核,每个驱动程序都有各自的makefile?
2 – ;或完整项目的常见makefile?
3 GT;我可以使用patsubst编译每个文件而不提及名称.
4>如何组合每个* .o来创建名为main的可执行文件.
编辑:—
@Jan Hudec
我根据你的评论修改了我的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)
……或者正如凯尔塔尔在评论中所建议的那样
$(shell find . -name '*.c')
这是递归的.
广告3:你正在做.
广告4:使用$(OBJ)作为依赖项创建目标,并像编译一样使用自动变量:
main : $(OBJ)
$(LD) $(LDFLAGS) -o $@ $< $(LIBS)
内容总结
以上是互联网集市为您收集整理的linux – make for compiling – 项目中文件夹和子文件夹中的所有* .c文件全部内容,希望文章能够帮你解决linux – make for compiling – 项目中文件夹和子文件夹中的所有* .c文件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。