我有几个C和C++项目都遵循我已经使用了一段时间的基本结构.我的源文件进入src/*.c,中间文件进入obj/*.[do],顶级目录中的实际可执行文件.
我的makefile大致遵循这个模板:
# The final executable
TARGET := something
# Source files (without src/)
INPUTS := foo.c bar.c baz.c
# OBJECTS will contain: obj/foo.o obj/bar.o obj/baz.o
OBJECTS := $(INPUTS:%.cpp=obj/%.o)
# DEPFILES will contain: obj/foo.d obj/bar.d obj/baz.d
DEPFILES := $(OBJECTS:%.o=%.d)
all: $(TARGET)
obj/%.o: src/%.cpp
$(CC) $(CFLAGS) -c -o $@ $<
obj/%.d: src/%.cpp
$(CC) $(CFLAGS) -M -MF $@ -MT $(@:%.d=%.o) $<
$(TARGET): $(OBJECTS)
$(LD) $(LDFLAGS) -o $@ $(OBJECTS)
.PHONY: clean
clean:
-rm -f $(OBJECTS) $(DEPFILES) $(RPOFILES) $(TARGET)
-include …Run Code Online (Sandbox Code Playgroud) 有时似乎没有构建新的可执行文件,即使我需要一个,但我不明白为什么.例如,当我更改Makefile时,但是已经存在可执行文件,并且当我执行'make'时,它不会创建更新的可执行文件.
Makefile的目的不是为了让我不再担心那些东西吗?
有没有办法在 makefile 中知道 GNU make 是在 linux 操作系统还是 windows 操作系统上运行?
我已经构建了一个 bash 脚本,它生成一个用于构建我的应用程序的 makefile,它在我的 Debian 机器上运行良好。我想尝试在 MinGW/MSYS 上构建它,但问题是我必须构建和运行一些测试程序来检查源代码中的错误,而要在 Windows 上运行它,我必须添加 .exe 后缀。
我在OSX Lion上有一个构建文件
VPATH = src include
CFLAGS ="-I include -std=gnu99"
hello: hello.o
gcc $^ -o $@
hello.o: hello.h hello.c
gcc $(CFLAGS) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行此make文件时,我收到以下错误
ld: warning: ignoring file hello.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
Undefined symbols for architecture x86_64:
"_main", referenced from:
start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我已尝试使用该标志-arch x86_64但仍然得到相同的错误.
运行arch命令给出:i386.
uname …
我的C++项目的目录结构是
/..
makefile <- the makefile is in root
/include <- subdirectory that has to be included while compiling
/obj <- target place for all *.o and final executable
/src <- sources
Run Code Online (Sandbox Code Playgroud)
我目前的makefile是:
CC=g++
CFLAGS=-c -Wall -std=c++11
INC=-Iinclude
SRC=src
TGT=obj
all: myapp
myapp: myapp.o
$(CC) $(TGT)/myapp.o -o $(TGT)/myapp
myapp.o:
$(CC) $(CFLAGS) $(INC) $(SRC)/myapp.cpp -o $(TGT)/myapp.o
clean:
rm -rf $(TGT)
mkdir $(TGT)
Run Code Online (Sandbox Code Playgroud)
这适用于我的第一个文件.我是一个总的makefile新手 - 请帮我编译目录下的所有文件/src,并将它们链接到/obj目录中的可执行文件.
makefile必须在Windows下工作,我使用的是MinGW和MSYS
我的问题涉及GNU的制作.
如果您有一系列命令可用作多个目标的配方,则罐装配方会派上用场.我可能看起来像这样:
define run-foo
# Here comes a
# sequence of commands that are
# executed line by line
endef
Run Code Online (Sandbox Code Playgroud)
现在您可以像这样使用罐装配方:
file1: input1:
$(run-foo)
$(pattern) : sub/% : %.inp
$(run-foo)
Run Code Online (Sandbox Code Playgroud)
等等.我想知道是否有可能定义带参数的罐装食谱(或类似的东西),以便我可以像这样执行它们:
file2: input2
$(run-foo) specific-parameter2 "additional"
file3: input3
$(run-foo) another-parameter3 "text"
Run Code Online (Sandbox Code Playgroud)
这可能吗?任何提示欢迎:)
我正在尝试编写一个 Makefile 来评估 Bash 命令的结果,例如uname.
生成文件:
OS1 = $(uname)
OS2 = Darwin
all:
@echo $(value OS1)
ifeq ($(uname),Darwin)
@echo "OK"
else
@echo "Fail"
endif
ifeq ($(OS1),Darwin)
@echo "OK"
else
@echo "Fail"
endif
ifeq ($(OS2),Darwin)
@echo "OK"
else
@echo "Fail"
endif
Run Code Online (Sandbox Code Playgroud)
输出:
Darwin
Fail
Fail
OK
Run Code Online (Sandbox Code Playgroud)
如何将变量OS1或命令$(uname)与Darwinan 中的文字进行比较ifeq?从我读过的内容来看ifeq,我的 Makefile 中的第二个应该可以工作,但它没有。
我在 OS X 10.9.3 上为 i386-apple-darwin11.3.0 使用 GNU Make 3.81。
在GNU make手册在解释这一部分不擅长,我找不到解释或者我不能推断其他地方的信息.
我知道%是一种通配符,但之间有什么区别%和*的背景下targets,dependencies和commands?我在哪里可以使用它,到处都有相同的含义?
target: dependencies ...
commands
Run Code Online (Sandbox Code Playgroud) 在中make,是否可以为每个目标定义前食谱和后食谱?
我想(隐式)在显式配方的第一行上方插入前食谱,然后(隐式)在显式配方的最后一行之后插入后食谱。
使用正则表达式插入行会很容易,但是隐式行会更干净。
我在makefile中喜欢这个
target1:
export var1=test
$(MAKE) target2
target2:
echo $(var1)
Run Code Online (Sandbox Code Playgroud)
这是空的
我有其他依赖项,所以我想在第一个目标中设置变量,然后所有子项依赖项应该能够访问它
编辑:
.ONESHELL:
target1:
export var1=test
echo $(var1)
Run Code Online (Sandbox Code Playgroud)
产量
make target1
export var1=test
echo
Run Code Online (Sandbox Code Playgroud) gnu-make ×10
makefile ×10
bash ×2
c++ ×2
dependencies ×2
macos ×2
debian ×1
gcc ×1
linux ×1
mingw ×1
os-agnostic ×1
os-detection ×1