标签: gnu-make

如何在 Linux 上的 C 中包含来自多个目录的文件?

       gcc main.c -o main -I include 
Run Code Online (Sandbox Code Playgroud)

我正在创建一个具有以下目录结构的小型 c 应用程序:

应用=>

  • => src(一个目录,包含所有源文件)
  • =>包含(一个目录,包含所有头文件)
  • => common(一个目录,包含所有公共文件)
  • => main.c

现在我正在尝试运行包含#include指令的main.c,以将头文件从包含目录和函数调用包含commonsrc目录中的.c文件中。我正在使用-I选项,但它仅对一个目录路径指示有用。编译器将如何在所有srccommoninclude目录中查找以解析调用。请建议我在使用gcc编译时提供一个命令或制作文件以提供多个目录的路径。

c makefile gnu-make

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

必须在makefile中写一个"强制"目标

我有一个(GNU)make文件,有两个像这样的依赖:

INP ?= main
DEPS ?= bibliography.bib
# md-->tex rule
%.tex: %.md $(DEPS)
    panzer  -o $@ $<

# tex-->pdf rule
%.pdf: %.tex
    latexmk $<

.PHONY: show 
show: $(INP).pdf
    showpdf $<
Run Code Online (Sandbox Code Playgroud)

这可以按预期工作:通过首先调用md - > tex规则,然后是tex - > pdf,最后是showpdf规则,在markdown文件发生变化时,make showmain.md(或我指定的任何其他markdown文件)创建并显示PDF .

现在我想添加一个force触发规则的目标md - > tex, tex - > pdfshowpdf,无论状态如何main.md.

这个答案我试着

force:
    rm $(INP).pdf
    make show
Run Code Online (Sandbox Code Playgroud)

但这不是很优雅而且相当脆弱. - 我怀疑必须有一种方法可以在当前的make调用中创建一个目标来说:

假设规则X(此处show …

makefile gnu-make

0
推荐指数
1
解决办法
375
查看次数

Makefile中类似命令的简化

我有一个makefile:

CFLAGS= -Wall -g

all: ex1.c 
    cc ex1.c -o ex1
    valgrind ./ex1
    cc ex2.c -o ex2
    valgrind ./ex2
    cc ex3.c -o ex3
    valgrind ./ex3

clean:
    rm -f ex1
    rm -f ex2
    rm -f ex3
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以简化这个,所以我不需要为每个文件添加3行(我期待~50个文件)而是我可以只插入一个数字,它将运行该数量的文件的命令?所有文件都具有相同的命名方案/^ex\d{1,}\.c/,并且都在同一目录中.

谢谢您的帮助.

c makefile gnu-make

0
推荐指数
1
解决办法
112
查看次数

在Make规则中分割字符串

我试图在Make target中用冒号分隔的值分割字符串。

当我尝试使用for循环,eval,shell分割目标配方中的字符串时,得到空白值。当我确实使用shell命令在目标结果之外拆分字符串时,结果是肯定的。

谁能帮我解决目标食谱。

以下是代码段。

notebooks=new:e7e45d89-94cc-4783-86c5-2236d9904a24 test:2af1d689-98c3-48f2-984d-2ea21c5135dd
j=new:e7e45d89-94cc-4783-86c5-2236d9904a24
f1=$(shell echo $j | cut -d: -f 1)
test1:
    @for i in $(notebooks); \
    do \
        $(eval f=$(shell echo $i | cut -d: -f 1))  \
        $(eval fid=$(shell echo $i | cut -d: -f 2)) \
        echo $(f) $(fid) $(f1) ;\
    done
Run Code Online (Sandbox Code Playgroud)

输出是

new
new
Run Code Online (Sandbox Code Playgroud)

而所需的输出是

new e7e45d89-94cc-4783-86c5-2236d9904a24 new 
test 2af1d689-98c3-48f2-984d-2ea21c5135dd new
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

0
推荐指数
1
解决办法
1211
查看次数

如何在变量赋值中获得"最多一次"语义?

Shell命令有时需要很长时间才能运行,因此您可能不想这样做VAR = $(shell slow-cmd) (=每次引用变量时都会运行slow-cmd).使用VAR := $(shell slow-cmd)可能很有用,但是如果您正在构建一个不需要扩展变量的目标,那么您将获得slow-cmd比所需更多的调用.在下面的makefile(使用gnu-make)中,您可以获得所需的行为:定义V2值的shell命令永远不会被多次调用,而对于目标,foo它根本不会被调用.但这是一个令人发指的污垢.是否有更合理的方法来确保变量仅在需要时定义,但从未评估过多次?

V1 = $(shell echo evaluating V1 > /dev/tty; echo V1 VALUE)

all: foo bar V2
        @echo $(V1) $@
        @echo $(V2) $@

foo:
        @echo $(V1) $@

bar: V2
        @echo $(V1) $@
        @echo $(V2) $@

V2:
        $(eval V2 := $(shell echo evaluating V2 > /dev/tty; echo V2 VALUE))

.PHONY: all foo bar
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

0
推荐指数
1
解决办法
110
查看次数

cd.. 在 Makefile 中无需 ONESHELL 即可工作

docs来看,有必要添加一个targetin.ONESHELL以使所有命令在同一个子 shell 进程中运行。对此的进一步讨论请参见此处

这是我的makefile

.PHONY: clean build
.ONESHELL: deploy

zip := my.zip

clean:
    cd ..
    rm -f $(zip)

build: clean
    npm install .
    zip -r ../$(zip) . \
        --exclude=package-lock.json \
        --exclude=.gitignore \
        --exclude=makefile \
        --exclude=*.git* 

... more lines
Run Code Online (Sandbox Code Playgroud)

因此,当我这样做时make build,父文件夹中的 zip 文件就会被创建。当我这样做时make clean(从同一目录),zip 也会从父文件夹中删除。我不明白的是,因为cd ..在独立的 shell 进程中运行,所以父文件夹中的 zip 不包含make clean在 中,因此如何使用命令删除它.ONESHELL

版本:Ubuntu 18.04 上的 GNU Make 4.1

ubuntu makefile gnu-make

0
推荐指数
1
解决办法
477
查看次数

makefile:如果变量为空,则在单个 make 目标上失败

我是构建 Makefile 的新手,并且正在尝试确定如果变量为空,构建目标将如何失败。我希望能够将变量作为环境变量或 make 参数传入。

假设我有一个这样的 makefile:

VER ?=

step0:
    echo "step0 should work"

step1: 
    echo "step1 should enforce variable"
    ifeq($(VER), "")
    $(error VER is not set)
    endif 
    echo "Success: Value of Ver ${VER}"

step2:
    echo "step2 should work"
Run Code Online (Sandbox Code Playgroud)

我希望能够运行以下测试用例:

VER="foo" make step1  
# should result in printing the "Success:" line
Run Code Online (Sandbox Code Playgroud)

或者

export VER=foo
make step1  
# should result in printing the "Success:" line
Run Code Online (Sandbox Code Playgroud)

或者

make step1 VER=foo  
# should result in printing the "Success:" line
Run Code Online (Sandbox Code Playgroud)

或者

make step1  
# …
Run Code Online (Sandbox Code Playgroud)

bash scripting makefile build gnu-make

0
推荐指数
1
解决办法
2068
查看次数

如何使用 make 构建 CS50 程序

我正在尝试在 linux 上学习 cs50 ,我下载了在 github 上找到的所有内容,但现在我无法使用 make 编译我的第一个程序,但我可以使用 clang 代替,clang hello.c -lcs50 -o hello它工作得很好,但是当我尝试使用编译时,make hello我得到

:~/cs50/pset1# make hello
cc     hello.c   -o hello
/usr/bin/ld: /tmp/cczILfhu.o: in function 'main':
hello.c:(.text+0x1a): undefined reference to 'get_string'
collect2: error: ld returned 1 exit status
make: *** [<builtin>: hello] Error 1
Run Code Online (Sandbox Code Playgroud)

我什至将下载的 libcs​​50 文件夹移动到 /usr/include/ 但我仍然得到相同的结果。在我用 clang 编译然后执行后,make hello它说 make: 'hello' 是最新的。我知道这听起来很垃圾,但我仍然是新手,正在寻求帮助。提前致谢。

c makefile gnu-make cs50

0
推荐指数
1
解决办法
3249
查看次数

Asan:asan 库加载问题

在我们的构建系统中,我们最近将 ASAN 工具(添加 -fsanitize=address)集成到 CFLAGS 中,同时也在链接、创建库 .so 文件的同时。注意:- 我们使用 GCC 6.3 编译器。

我们能够成功构建我们的代码。但是在运行时失败并出现以下问题:

==52215==ASan runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD.
Run Code Online (Sandbox Code Playgroud)

这是我的 gcc 命令:-

/local/common/pkgs/gcc/v6.3.0/bin/gcc -m32 -shared -o /local/testing/build/new_tool/asan_build/syn/verilog/libspd.so  -Wl,-rpath=\$ORIGIN/lib -Wl,-rpath=\$ORIGIN/../lib -W1,-rpath=/local/common/gcc/v6.3.0/lib  -fsanitize=address -L/local/testing/build/new_tool/asan_build/modules /local/testing/build/new_tool/asan_build/modules/silvpi.o /local/testing/build/new_tool/asan_build/modules/sypsv.o /local/testing/build/new_tool/asan_build/modules/cdnsv_tfs.o /local/testing/build/new_tool/asan_build/modules/libcore.o /local/testing/build/new_tool/asan_build/modules/vpi_user.o /local/testing/build/new_tool/asan_build/modules/libdenbase.a /local/testing/build/new_tool/asan_build/modules/libbdd.a  -L/local/testing/build/new_tool/asan_build/syn/lib -L/local/testing/build/new_tool/asan_build/modules -L/home/local/outer/Linux/lib /local/testing/build/new_tool/asan_build/modules/vhpimodelfunc.o /local/testing/build/new_tool/asan_build/modules/vipcommonlib.a  -lm -lc -ldenbase -lbdd -ldenbase -lviputil -llocalCommonMT_sh
Run Code Online (Sandbox Code Playgroud)

我能够libspd.so成功构建库。但是当我们尝试运行它时,它会因我提到的上述错误而失败。

我可以看到依赖库列表 libspd.so

ldd /local/testing/build/new_tool/asan_build/syn/verilog/libspd.so
    linux-gate.so.1 =>  (0x00279000)
    libasan.so.3 …
Run Code Online (Sandbox Code Playgroud)

gcc gnu-make address-sanitizer

0
推荐指数
1
解决办法
6624
查看次数

无论 --jobs 是什么,GNU Make 都只使用 4 个线程

无论--jobs我要提出什么论点,我总是得到 4 个线程。

make --jobs=1 target我可以这样开始的标准输出线看make[1]:make[2]:make[3]:make[4]:当我只会想到一个单独的线程。

如果我使用make --jobs=100 target,结果相同,我得到 4 个线程而不是 100 个。

我不确定这是否相关,但我在 docker 容器中运行 make 并且 docker 有 7 个可用的本地主机内核。

>docker info
Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 7
Run Code Online (Sandbox Code Playgroud)

在 Alpine Linux docker 容器内

>make --version
GNU Make 4.2.1
Built for x86_64-alpine-linux-musl

>grep -c ^processor /proc/cpuinfo
7
Run Code Online (Sandbox Code Playgroud)

确认容器获得 7 个内核。

有什么我可以运行的东西可以帮助我缩小为什么 make 会这样?

makefile gnu-make docker

0
推荐指数
1
解决办法
46
查看次数

标签 统计

gnu-make ×10

makefile ×9

c ×3

address-sanitizer ×1

bash ×1

build ×1

cs50 ×1

docker ×1

gcc ×1

scripting ×1

ubuntu ×1