标签: gnu-make

gnu make:列出特定运行中所有变量(或"宏")的值

如何在运行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)

makefile gnu-make

38
推荐指数
4
解决办法
3万
查看次数

并行make:将-j8设置为默认选项

我可以使用-j参数为构建过程设置线程数.例如,我有4个核心+4虚拟.当我写:make -j8速度增加4倍.

是否可以将该值设置为默认值?(例如,在Linux Gentoo中,在配置文件中,可以设置此默认值).

ps我有Arch Linux

linux makefile build gnu-make parallel-builds

36
推荐指数
3
解决办法
2万
查看次数

如何在Makefile中使用自动变量获取第二个依赖项文件?

我需要从规则中获取第n个依赖文件,类似于bash中的$ n.我需要这个,因为我想将各个依赖项文件作为构建程序的选项提供.

这是一个例子:

dep.o: dep.src config1.cfg config2.cfg
    parse -cfg1 $2 -cfg2 $3 -o $@ $<
Run Code Online (Sandbox Code Playgroud)

可能吗?

makefile gnu-make

36
推荐指数
1
解决办法
5533
查看次数

ldconfig错误:不是符号链接

运行时:

    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,lib2lib3.

现在,当我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(在某些时候我在二进制文件夹上测试了它),发生了同样的错误.

linux linker makefile gnu-make

36
推荐指数
3
解决办法
8万
查看次数

依赖于目录下所有文件的Makefile规则(包括在子目录中)

我的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只查看目录本身的修改日期,只有在添加,删除或重命名直接子项时才会更改).

glob makefile wildcard gnu-make

36
推荐指数
1
解决办法
2万
查看次数

makefile中处理组件的顺序

在makefile中,依赖行的形式是 -

abc: x y z
Run Code Online (Sandbox Code Playgroud)

所有三个组件(x,y,z)本身都是makefile中进一步向下的依赖行中的目标.

如果调用make abc,将执行三个目标x,y,z的顺序是什么?

makefile gnu-make

35
推荐指数
3
解决办法
3万
查看次数

make命令makefile出错:18:***缺少分隔符.停止

对于下面复制的以下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 gnu-make

35
推荐指数
3
解决办法
9万
查看次数

是否有可能在GNU makefile中有多个.PHONY目标?

由于各种原因,我可以方便地在makefile的多个部分中指定.PHONY.我觉得我没有正确理解这是如何工作的,但这可能吗?

而不是.PHONY: clean cleanall 做:

.PHONY: clean
<some text>
.PHONY: cleanall
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

34
推荐指数
1
解决办法
8894
查看次数

无法在配方内分配变量

我该如何工作?它出错"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 gnu-make

33
推荐指数
1
解决办法
2万
查看次数

通配符获取所有目录的列表

在我的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文件.

任何建议为什么会发生这种情况以及如何解决它?其他获得该清单的解决方案也是受欢迎的.

makefile wildcard gnu-make

31
推荐指数
3
解决办法
3万
查看次数

标签 统计

gnu-make ×10

makefile ×10

linux ×2

wildcard ×2

build ×1

glob ×1

linker ×1

parallel-builds ×1