gcc main.c -o main -I include
Run Code Online (Sandbox Code Playgroud)
我正在创建一个具有以下目录结构的小型 c 应用程序:
应用=>
现在我正在尝试运行包含#include指令的main.c,以将头文件从包含目录和函数调用包含到common和src目录中的.c文件中。我正在使用-I选项,但它仅对一个目录路径指示有用。编译器将如何在所有src、common和include目录中查找以解析调用。请建议我在使用gcc编译时提供一个命令或制作文件以提供多个目录的路径。
我有一个(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 show从main.md(或我指定的任何其他markdown文件)创建并显示PDF .
现在我想添加一个force触发规则的目标md - > tex, tex - > pdf和showpdf,无论状态如何main.md.
从这个答案我试着
force:
rm $(INP).pdf
make show
Run Code Online (Sandbox Code Playgroud)
但这不是很优雅而且相当脆弱. - 我怀疑必须有一种方法可以在当前的make调用中创建一个目标来说:
假设规则X(此处
show …
我有一个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/,并且都在同一目录中.
谢谢您的帮助.
我试图在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) 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) 从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
我是构建 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) 我正在尝试在 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)
我什至将下载的 libcs50 文件夹移动到 /usr/include/ 但我仍然得到相同的结果。在我用 clang 编译然后执行后,make hello它说 make: 'hello' 是最新的。我知道这听起来很垃圾,但我仍然是新手,正在寻求帮助。提前致谢。
在我们的构建系统中,我们最近将 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) 无论--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 会这样?