我有几个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) 使用GNU Make我想从变量中删除值:
VAR := x.c y.c z.c
<snip>
VAR += x_x.c y_y.c
Run Code Online (Sandbox Code Playgroud)
我现在想从变量中删除"xc"和"yc".我尝试过使用subst命令,但也删除了x_x.c.
有没有办法做到这一点?
最终变量应如下所示:
VAR = z.c x_x.c y_y.c
Run Code Online (Sandbox Code Playgroud) 有时似乎没有构建新的可执行文件,即使我需要一个,但我不明白为什么.例如,当我更改Makefile时,但是已经存在可执行文件,并且当我执行'make'时,它不会创建更新的可执行文件.
Makefile的目的不是为了让我不再担心那些东西吗?
我的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
我有一个项目与一些文件夹碰巧包含具有相同名称的源文件.
我的源代码树看起来像这样:
project.pro
foo/
conflict.h
conflict.cpp
bar/
conflict.h
conflict.cpp
some.h
other.h
files.h
main.cpp
Run Code Online (Sandbox Code Playgroud)
默认情况下,qmake生成一个Makefile,它将生成如下构建树:
conflict.o
main.o
target
Run Code Online (Sandbox Code Playgroud)
哪里conflict.o是导致该目标文件都foo/conflict.cpp和foo/conflict.h.
我无法更改其名称,因为它们是使用外部工具生成的,强制使用不同的文件名意味着更改其内容,因此这不是一个选项.
我也不想使用qmake SUBDIRS模板,因为这意味着(1)每个子目录都是作为库单独构建的,因此整个构建过程(至少在我看来)和(2)在顶层非常复杂目录我不能有任何源文件.还是我错了?
我不能告诉qmake将目标文件写入构建目录中的单独目录吗?所以我的构建树将如下所示:
foo/
conflict.o
bar/
conflict.o
main.o
target
Run Code Online (Sandbox Code Playgroud)
或者是否有任何其他解决方案既不需要重命名源文件也不需要引入像静态库这样复杂的东西?我无法相信Qt多年来一直没有解决这个问题(在我看来很简单).(我已经在4年前解决了这个问题,但可以重命名该项目中的文件,而在这里我不能.)
如果它很重要:我在使用G ++的Ubuntu和使用mingw32的Windows上使用Qt 4.8.
我的问题涉及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)
这可能吗?任何提示欢迎:)
我正在浏览Android开源项目makefile,我看到了包含另一个makefile的两种不同方式.例如,master/build/target/product/aosp_arm64.mk有这些行:
PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/permissions/android.hardware.ethernet.xml
$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/board/generic_arm64/device.mk)
include $(SRC_TARGET_DIR)/product/emulator.mk
PRODUCT_NAME := aosp_arm64
PRODUCT_DEVICE := generic_arm64
PRODUCT_BRAND := Android
PRODUCT_MODEL := AOSP on ARM arm64 Emulator
Run Code Online (Sandbox Code Playgroud)
$(call inherit-product ...)线和include ...线之间有什么区别?
最新版本make有一个选项--output-sync,可以使每个目标的STDOUT成为原子,以便在使用时不会交错多个目标的语句make --jobs=N
不幸的是,我必须使用,make v 3.81因为这是我们的SDK附带的那个.
为了确定我是否需要--output-sync,我在目标周围添加了一些"保护声明"
all: $(patsubst %.cpp, %.o, $(wildcard *.cpp))
%.o: %.cpp
@echo BEFORE
@echo MAKEFLAGS=$(MAKEFLAGS)
qcc.exe $(CC_FLAGS) $@ $<
@echo AFTER
Run Code Online (Sandbox Code Playgroud)
输出非常交错.
AFTER
BEFOREAFTER
AFTER
AFTER
Run Code Online (Sandbox Code Playgroud)
有没有办法模拟--output-sync功能?
据我所知,如果有一种方法可以"锁定STDOUT mutex"预配方并在配方后释放它,那么构建速度可能会受到影响.
我很好修改我们的每个目标,如果这是它需要的.
我在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) 我想std::experimental::filesystem在我的代码中使用,这要求我使用-lstdc++fsGCC和-lc++experimentalClang 进行编译。目前,我有一个makefile,makefile.clang反映了编译方面的差异,或者,我考虑过使用clang构建目标,以便可以运行build clang。
有一些规范的方法可以在Makefile中设置特定于编译器的标志吗?