考虑以下目录结构:
.
bar/
foo/
test.ext1
_foo/
Run Code Online (Sandbox Code Playgroud)
我用以下规则编写了一个 makefile:
_%.ext2: bar/%.ext1 # % should match foo/test
echo $*
Run Code Online (Sandbox Code Playgroud)
然而运行make _foo/test.ext2给出:
make: *** No rule to make target '_foo/test.ext2'. Stop.
Run Code Online (Sandbox Code Playgroud)
当我查看时make -d _foo/test.ext2,它甚至没有考虑上述规则,即它直接跳到尝试内置规则。我不明白这里发生了什么,有人可以向我解释一下吗?
编辑:我希望能够从 中的任意文件生成bar,例如:
bar/foo/test-2.ext1->_foo/test-2.ext2bar/baz/another.ext1->_baz/another.ext2_foo和的存在_baz是有保证的。
我有一个相当大的项目(4272 .o 文件),但无法将其与 GNU Make 链接。我遇到了make: /bin/sh: Argument list too long。这是一个使用 qmake 生成 makefile 的 Qt 5 项目。
我知道有很多关于此的问题,但我不知道如何将任何解决方案应用于我的问题。我也不完全确定为什么我在链接步骤中遇到这个问题。我得到的错误是:
make: /bin/sh: Argument list too long
用于链接我的项目的 makefile 条目如下所示:
build/debug/my_target/my_target: $(OBJECTS)
@test -d build/debug/my_target/ || mkdir -p build/debug/my_target/
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
Run Code Online (Sandbox Code Playgroud)
它扩展到类似:
@echo linking /build/debug/my_target/my_target && clang++ -ccc-gcc-name g++ -lc++ -L/path/to/licensing/lib -Wl,-rpath,/path/to/qt/lib -Wl,-rpath-link,/path/to/qt/lib -o build/debug/my_target/my_target build/debug/my_target/obj/object1.o build/debug/my_target/obj/object2.o ... build/debug/my_target/obj/object4272.o ... [ a bunch of moc_X.o ] ... [ a bunch of libs ] …Run Code Online (Sandbox Code Playgroud) 我现在开始了解模块
如果我们想使用import <iostream>;而不是旧的样式,#include <iostream>我们需要“预编译”iostream头文件。我们可以通过简单地调用 g++ 来手动完成:
g++ -xc++-system-header -std=c++20 -fmodules-ts iostream
但这需要为所有使用的系统头文件手动创建一组规则,并将gnu make所有依赖项指向gcm.cache目录结构。
对于旧样式#include指令,我们只需使用-M或-MM标志即可自动生成此类依赖项make。
问:我们如何自动从导入的模块g++中获取此类依赖关系来设置规则?gnu make
目标非常简单:.gcm在构建系统需要导入这些文件之前预编译所有需要的文件。
我想在依赖于模式的变量中定义具有依赖关系的GNU make模式规则.我想要的是这样的:
%.exe : $(%_EXE_SOURCES) $(%_EXE_RESOURCES)
$(CSC_V)$(CSC) $(CSCFLAGS) $($*_EXE_CSCFLAGS) -target:exe \
-out:$@ $($*_EXE_SOURCES) $($*_EXE_RESOURCES)
Run Code Online (Sandbox Code Playgroud)
并在以后定义类似的东西
FOO_EXE_SOURCES = src/Foo.cs
all: Foo.exe
Run Code Online (Sandbox Code Playgroud)
提出的规则有助于建立; 在规则的主体中,$($*_EXE_SOURCES)变量被扩展为$(FOO_EXE_SOURCES),扩展为src/Foo.cs.但是,依赖关系不能正确扩展; 更改src/Foo.cs不会导致重建Foo.exe.
我怀疑这实际上不能在make中完成,但也许有人有一个类似工作的make片段?
如何强制GNU Make变量立即评估?请考虑以下示例:
TARGET:=fred
wilma:
mkdir -p $(TARGET)
TARGET:=barney
betty:
mkdir -p $(TARGET)
all: one two
.PHONY: one two all
Run Code Online (Sandbox Code Playgroud)
使用make all,Make只会创建"barney",因为只有在读取了makefile并分配了最终值("barney")后才会计算配方字符串.
在这种情况下,我需要创建"fred"和"barney".
我试图用白色空间编译一个项目到路径目录.在这里你有我的Makefile:
NAME = ./Release/Online_pricer
SRCS = ./Online_pricer/main.cpp \
./Online_pricer/Currency.cpp \
./Online_pricer/Curve.cpp \
./Online_pricer/Environment.cpp \
./Online_pricer/My_convert.cpp \
./Online_pricer/My_exception.cpp \
./Online_pricer/ParserTab.cpp \
./Online_pricer/Spot.cpp \
./Online_pricer/Volatility.cpp \
./Online_pricer/VolatilityCapFloor.cpp \
./Online_pricer/VolatilitySwaption.cpp \
../Files\\ cpp/Functions.cpp \
../Files\\ cpp/UtilitiesWeb.cpp
#####################################################
OBJS = $(SRCS:.cpp=.o)
CC = g++
RM = rm -f
CFLAGS = -g -W -Wall -Werror
INCL = ../Files\ .h/
#####################################################
$(NAME) : $(OBJS)
@$(CC) $(OBJS) -I$(INCL) $(LIB) -o $(NAME)
@printf "\n \033[33m[Message]\033[39m Compilation under Linux done\n"
.cpp.o :
@$(CC) -I$(INCL) $(CFLAGS) -c $< -o $@ …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个正确的Makefile.
我想要的是完全控制正在发生的事情,所以我不想要任何第三方软件.
我当前的尝试对我来说似乎是逻辑,但由于依赖关系生成无效,我有点卡住了.
为了更好的可读性,完整的Makefile被分成几小块.如果有什么需要改进,我将不胜感激任何评论.
首先,我有以下静态定义
CXX = g++
CXXFLAGS = -Wall \
-Wextra \
-Wuninitialized \
-Wmissing-declarations \
-pedantic \
-O3 \
-p -g -pg
LDFLAGS = -p -g -pg
DEPFLAGS = -MM
Run Code Online (Sandbox Code Playgroud)
Afaik这应该没问题.使分析标志可选是完美的,但这并不重要.
SRC_DIR = ./src
OBJ_DIR = ./obj
SRC_EXT = .cpp
OBJ_EXT = .o
TARGET = ./bin/my_target
SRCS = $(wildcard $(SRC_DIR)/*$(SRC_EXT))
OBJS = $(subst $(SRC_DIR), $(OBJ_DIR), $(SRCS:$(SRC_EXT)=$(OBJ_EXT)))
DEP = depend.main
Run Code Online (Sandbox Code Playgroud)
基本上,这应该只是提取所有*.cpp文件出的子文件夹中src,另外更换./src用./obj,并.cpp与.o作为对象的名称.
.PHONY: clean all depend
all: …Run Code Online (Sandbox Code Playgroud) 我有以下代码来解压缩目录中的所有文件并将其移动到构建目录.如果我多次调用make,它会尝试每次都执行"build"目标,即使build目录已经存在.有没有人碰到过这个?
我发现了这个问题,但不一样. Makefile始终运行目标
操作系统:Ubuntu 12.04程序:GNU Make 3.81
build: mkBuildDir untar
chmod 700 build
.PHONY: mkBuildDir untar
mkBuildDir:
mkdir build
untar: *.tar.gz
for prefix in *.tar.gz; do \
tar xvf $$prefix --directory=build; \
done
clean:
rm -Rf build
Run Code Online (Sandbox Code Playgroud) 我有这样的makefile:
setup:
setenv var1 "$(var1)"; \
setenv var2 "$(var2)";
task1: setup
source task1.csh
task2: setup
source task2.csh
Run Code Online (Sandbox Code Playgroud)
我使用这个命令调用makefile:
make var1=value1 var2=value2 task1
Run Code Online (Sandbox Code Playgroud)
我想要环境变量var1并var2在task1.csh和中可见task2.csh,但除非我将makefile更改为:否则我无法这样做
task1:
setenv var1 "$(var1)"; \
setenv var2 "$(var2)"; \
source task1.csh
task2:
setenv var1 "$(var1)"; \
setenv var2 "$(var2)"; \
source task2.csh
Run Code Online (Sandbox Code Playgroud)
为什么第一种方法不起作用,我该如何解决?
在Makefile中我有:
images/schematic.pdf:images/schematic.svg
Run Code Online (Sandbox Code Playgroud)inkscape -D -z --file=$^ --export-pdf=$@ --export-latex sed -i "s:schematic:images/schematic:g" $@_tex
这条规则的作用是:
.pdfPDF文件及其相应的.pdf_tex文本文件(请参阅此答案:https://tex.stackexchange.com/a/2107/104581).pdf_tex文件,以便它不会破坏"更高"目录中的乳胶编译(即.当.pdf_tex文件在时./images)我有很多这种形式的规则,即只有schematic改变的地方.我想用一个模式规则替换schematic的%.并%在配方中使用(在sed命令中).
但是规则:
images /%.pdf:images /%.svg
Run Code Online (Sandbox Code Playgroud)inkscape -D -z --file=$^ --export-pdf=$@ --export-latex sed -i "s:%:images/%:g" $@_tex
不起作用:%在食谱中按字面解释.
我还尝试用$%替换配方中的%,但这个变量似乎是空的.
在配方中添加一行来创建一个(make)变量,该变量将保存结果notdir(removeprefix($<))(使用此问题或调用bash,因为GNU Make中没有removeprefix).
gnu-make ×10
makefile ×9
c++ ×3
c++20 ×1
clang++ ×1
code-cleanup ×1
compilation ×1
dependencies ×1
g++ ×1
linux ×1
module ×1