我认为这是一个多次被问到的问题,但我找不到正确的方法.
我有以下结构:
project/
project/Makefile
project/code
project/code/*.cc
project/code/Makefile
Run Code Online (Sandbox Code Playgroud)
当我在"项目/代码"目录中并调用"make project_code"时,我的代码正在正确编译.
我想这样做,当我在"项目/",只是呼吁"让project_code",仿佛我是在"项目/代码".
生成文件"项目/ Makefile文件"将包含其他的规则(如"安装")和一些规则来编译,就好像我是在"项目/代码".为此,我请求你的帮助......谢谢.
有人可以解释如何在Makefile中使用if-then语句和for循环吗?我似乎无法通过示例找到任何好的文档.
我在一堆子目录中有源代码,如:
src/widgets/apple.cpp
src/widgets/knob.cpp
src/tests/blend.cpp
src/ui/flash.cpp
Run Code Online (Sandbox Code Playgroud)
在项目的根目录中,我想使用以下规则生成单个Makefile:
%.o: %.cpp
$(CC) -c $<
build/test.exe: build/widgets/apple.o build/widgets/knob.o build/tests/blend.o src/ui/flash.o
$(LD) build/widgets/apple.o .... build/ui/flash.o -o build/test.exe
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,它找不到build/widgets/apple.o的规则.我是否可以更改某些内容,以便在需要生成build/widgets/apple.o时使用%.o:%.cpp?
我在尝试使用make将目标文件放在一个单独的子目录中时遇到了麻烦,这可能是一种非常基本的技术.我尝试使用此页面中的信息:http: //www.gnu.org/software/hello/manual/make/Prerequisite-Types.html#Prerequisite-Types
我从make获得以下输出:
make: *** No rule to make target `ku.h', needed by `obj/kumain.o'. Stop.
Run Code Online (Sandbox Code Playgroud)
但是ku.h是一个依赖而不是一个目标(尽管它显然是在c源文件中的#included).当我不尝试使用目标文件的子目录(即错过OBJDIR部分)时,它工作正常.为什么认为ku.h是目标?
我的makefile是这样的:(风格是在阅读各种信息来源后)
.SUFFIXES:
.SUFFIXES: .c .o
CC=gcc
CPPFLAGS=-Wall
LDLIBS=-lhpdf
VPATH=%.c src
VPATH=%.h src
VPATH=%.o obj
OBJDIR=obj
objects= $(addprefix $(OBJDIR)/, kumain.o kudlx.o kusolvesk.o kugetpuz.o kuutils.o \
kurand.o kuASCboard.o kuPDFs.o kupuzstrings.o kugensud.o \
kushapes.o )
ku : $(objects)
$(CC) $(CPPFLAGS) -o ku $(objects) $(LDLIBS)
$(objects) : ku.h kudefines.h kuglobals.h kufns.h | $(OBJDIR)
$(OBJDIR):
mkdir $(OBJDIR)
.PHONY: clean
clean :
rm $(objects)
Run Code Online (Sandbox Code Playgroud)
编辑:我应用了更改以使用vpath指令.我的版本是VPATH = xxx和vpath%.c xxx的错误混合.但是我现在得到了另一个问题(这是我添加错误的vpath之前的原始问题).这是输出: …
我只知道非常基本的makefile语法,并且正在阅读另一个项目makefile并且遇到:=了宏声明.他们为什么要用它?
换句话说,两者之间是否有任何区别
MYMACRO = hi i'm a macro
Run Code Online (Sandbox Code Playgroud)
和
MYMACRO := hi i'm a macro
Run Code Online (Sandbox Code Playgroud)
?
这是一个非常简单的问题,但我是makefiles的新手.我正在尝试制作一个将编译两个独立程序的makefile:
program1:
gcc -o prog1 program1.c
program2:
gcc -o prog2 program2.c
Run Code Online (Sandbox Code Playgroud)
所有在线示例都会比我需要的更多细节,让人感到困惑!我真正想做的就是运行两条gcc线.我究竟做错了什么?
mm(make)命令构建此应用程序 因为我必须一次又一次地更改和构建这个应用程序,所以我想在它中添加一个构建时间戳Contacts.apk来检查我们在手机中运行它时的构建时间.
我们知道,当我们运行mm命令时,Android.mk将调用Contacts包中的(makefile).
现在,我们可以使用date-macro 获取构建时间.
但是我们如何将这个构建时间戳写入我们的应用程序可以在运行时读取的文件中?
有什么建议?
我想做一件简单的事情:
TMPDIR ?= /tmp
test:
@echo $(TMPDIR)
Run Code Online (Sandbox Code Playgroud)
这有效,如果我运行:
$ make test
/tmp
Run Code Online (Sandbox Code Playgroud)
如果我运行它也有效:
$ make test -e TMPDIR=~/tmp
/home/user/tmp
Run Code Online (Sandbox Code Playgroud)
我还能做些什么呢?
$ TMPDIR=~/tmp make test
/home/user/tmp
Run Code Online (Sandbox Code Playgroud) 我正在做一个快速增长的项目,保持目标文件的日期是没有选择的.wildcard命令之外的问题介于"我不想要递归的makefile"和"我不希望它手动列出"之间.这些对象应该进入一个单独的目录,该目录已经可以使用.注:我不是说用的makefile,我知道的基本知识,但一切都超出了......
所以我的问题是: 如何以递归方式扫描src文件夹并以智能方式执行此操作?
我已经用多个SRC变量做了这个但是这很难看,并且整个makefile与越来越多的目录混乱.
我目前使用的是:
OS = Linux
VERSION = 0.0.1
CC = /usr/bin/gcc
CFLAGS = -Wall -g -D_REENTRANT -DVERSION=\"$(VERSION)\"
LDFLAGS = -lm `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`
BUILDDIR = build
SOURCEDIR = src
HEADERDIR = src
SOURCES = $(wildcard $(SOURCEDIR)/*.c)
OBJECTS = $(patsubst $(SOURCEDIR)/%.c, $(BUILDDIR)/%.o, $(SOURCES))
NAME = cinnamon
BINARY = cinnamon.bin
ECHO = echo
RM = rm -rf
MKDIR = mkdir
INSTALL = install
.PHONY: all clean setup
all: $(BINARY)
$(BINARY): $(BUILDDIR)/$(OBJECTS)
$(CC) $(CFLAGS) $(LDFLAGS) …Run Code Online (Sandbox Code Playgroud)