如何在运行make时列出Makefile中所有变量(也称为宏)的当前值?
例如,如果这是在Makefile中:
CUR-DIR := $(shell /bin/pwd)
LOG-DIR := $(CUR-DIR)/make-logs
Run Code Online (Sandbox Code Playgroud)
然后我想告诉我:
CUR-DIR = /home/johv/src/test
LOG-DIR = /home/johv/src/test/make-logs
Run Code Online (Sandbox Code Playgroud) 我可以使用-j参数为构建过程设置线程数.例如,我有4个核心+4虚拟.当我写:make -j8速度增加4倍.
是否可以将该值设置为默认值?(例如,在Linux Gentoo中,在配置文件中,可以设置此默认值).
ps我有Arch Linux
我需要从规则中获取第n个依赖文件,类似于bash中的$ n.我需要这个,因为我想将各个依赖项文件作为构建程序的选项提供.
这是一个例子:
dep.o: dep.src config1.cfg config2.cfg
parse -cfg1 $2 -cfg2 $3 -o $@ $<
Run Code Online (Sandbox Code Playgroud)
可能吗?
运行时:
sudo /sbin/ldconfig
Run Code Online (Sandbox Code Playgroud)
出现以下错误:
/sbin/ldconfig: /usr/local/lib/ is not a symbolic link
Run Code Online (Sandbox Code Playgroud)
当我运行文件时:
file /usr/local/lib/
/usr/local/lib/: directory
Run Code Online (Sandbox Code Playgroud)
里面/usr/local/lib/有我使用的三个库.我会在这里称他们为lib1,lib2和lib3.
现在,当我ldd在我的二进制文件上执行时,它会产生:
lib1.so => not found
lib2.so => not found
lib3.so => /usr/local/lib/lib3.so (0x00216000)
Run Code Online (Sandbox Code Playgroud)
但是所有的文件夹都在同一个文件夹中/usr/local/lib/{lib1,lib2,lib3}.so.
每次运行时ldconfig,都会出现相同的错误:
/usr/local/lib/ is not a symbolic link
Run Code Online (Sandbox Code Playgroud)
我认为/usr/local/lib应该两次申报/etc/ld.conf.d/*.conf,但不是:
sudo egrep '\/usr\/local' /etc/ld.so.conf.d/*
projectA.conf.old:/usr/local/projectA/lib
local.conf:/usr/local/lib
Run Code Online (Sandbox Code Playgroud)
ld.so.conf只包括/etc/ld.so.conf.d/*.conf,所以这*.old不是处理,它指的是/usr/local/projectA/lib.
经过一段时间后,我删除了所有的lib1和lib2(在某些时候我在二进制文件夹上测试了它),发生了同样的错误.
我的Makefile中的一条规则将整个目录(res/)压缩为ZIP文件.显然,当目录下的任何文件res/发生更改时,需要执行此规则.因此,我希望规则将该目录下的所有文件作为先决条件.我该如何实施这条规则?
在启用了globstar选项的 Bash中,您可以使用通配符模式获取该目录中所有文件的列表res/**/*.但是,如果将其指定为Makefile中的先决条件,它似乎不起作用:
filename.jar: res/**/*
Run Code Online (Sandbox Code Playgroud)
即使在touch输入文件后res/,仍然可以生成报告
make: `filename.jar' is up to date.
Run Code Online (Sandbox Code Playgroud)
很明显它没有认识到这种模式.
如果我将目录本身声明为先决条件:
filename.jar: res
Run Code Online (Sandbox Code Playgroud)
然后在修改文件时不会重新执行Make(我认为make只查看目录本身的修改日期,只有在添加,删除或重命名直接子项时才会更改).
在makefile中,依赖行的形式是 -
abc: x y z
Run Code Online (Sandbox Code Playgroud)
所有三个组件(x,y,z)本身都是makefile中进一步向下的依赖行中的目标.
如果调用make abc,将执行三个目标x,y,z的顺序是什么?
对于下面复制的以下make文件,我收到了丢失的分隔符错误.tabspace似乎没有任何问题.
OBJS = driver.o snapshot.o
SHOBJS = malloc.o mymemory.o
CC = g++
DEBUG = -g
CFLAGS = -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)
Snapshot: $(OBJS)
$(CC) $(LFLAGS) $(OBJS) -o Snapshot
driver.o: snapshot.h driver.cpp
$(CC) $(CFLAGS) driver.cpp
snapshot.o: mymemory.h snapshot.h snapshot.cpp
$(CC) $(CFLAGS) snapshot.cpp
libmymemory.so: $(SHOBJS)
gcc -shared -o libmymemory.so malloc.o mymemory.o
malloc.o: malloc.c
gcc -fPIC -g -c -Wall malloc.c
mymemory.o: mymemory.cpp
gcc -fPIC -g -c -Wall mymemory.cpp
clean:
\rm *.o *~ Snapshot
Run Code Online (Sandbox Code Playgroud) 由于各种原因,我可以方便地在makefile的多个部分中指定.PHONY.我觉得我没有正确理解这是如何工作的,但这可能吗?
而不是.PHONY: clean cleanall
做:
.PHONY: clean
<some text>
.PHONY: cleanall
Run Code Online (Sandbox Code Playgroud) 我该如何工作?它出错"make:somevariable:command not found"
sometarget:
somevariable = somevalue
Run Code Online (Sandbox Code Playgroud)
完整示例:
CXXFLAGS = -I/usr/include/test -shared -fPIC
OBJ = main.o Server.o
blabla : $(OBJ)
ifeq ($(argsexec),true)
# Creates an executable
CXXFLAGS = -I/usr/include/test
$(CXX) -o blabla $(OBJ) $(CXXFLAGS)
else
# Creates a library
DESTDIR = /home/pc
$(CXX) -o blabla $(OBJ) $(CXXFLAGS)
./bn.sh
endif
Run Code Online (Sandbox Code Playgroud) 在我的Makefile中,我需要获取其他目录中存在的所有目录的列表.
要获取与Makefile我使用的文件夹相同的所有目录的列表:
DIRECTORIES = $(wildcard */)
all:
echo $(DIRECTORIES)
Run Code Online (Sandbox Code Playgroud)
哪个工作正常,并给我所需的清单.但是,如果我想要使用另一个目录中的所有目录的列表
DIRECTORIES = $(wildcard ../Test/*/)
all:
echo $(DIRECTORIES)
Run Code Online (Sandbox Code Playgroud)
我得到的所有文件(路径)在该目录中,包括列表.h和.cpp文件.
任何建议为什么会发生这种情况以及如何解决它?其他获得该清单的解决方案也是受欢迎的.