我在我的机器上有通常的gcc(在/ usr/bin/gcc),当我为我正在处理的某个框架设置环境时,另一个(更新的)被链接.
我想用/ usr/bin/gcc上的旧版本编译,而不是使用新版本.
我必须使用"gmake"命令进行编译(自定义编译设置).
在不改变PATH的情况下,我怎么能"告诉"gmake使用不同的gcc?
今天,当我使用 --debug=v 构建我的项目时,我注意到一些我并不真正理解它的含义的东西。
在他包含“子生成文件”的顶部有一个奇怪的打印输出,它告诉我(搜索路径)(没有〜扩展)......这是什么意思?
打印输出如下所示:
Reading makefiles...
Reading makefile `Makefile'...
Reading makefile `make_pc.mk' (search path) (no ~ expansion)...
Reading makefile `print_ring/make.mk' (search path) (no ~ expansion)...
Reading makefile `vendor/unity/make.mk' (search path) (no ~ expansion)...
Reading makefile `test01/make.mk' (search path) (no ~ expansion)...
Run Code Online (Sandbox Code Playgroud)
使用 include 的主 Makefile 中的行如下所示:
TEST := test01
include $(TEST)/make.mk
Run Code Online (Sandbox Code Playgroud)
包含的 makefile 可能如下所示:
CFLAGS += -Itest01/
OBJ += test_main.o
test_main.o: test01/test_main.c
@ echo ".compiling"
$(CC) $(CFLAGS) -o $@ $<
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来使用搜索路径?但是 ~ 会扩展到我的 unix 用户主目录吗?
注意:我在 Linux (Ubuntu) …
我的源文件不在我需要做的一个目录中 ../ 或 ../../ 东西。
之后,我需要更改源文件名,例如: ../ex/test.c to obj/test.o
用这个: 命令:
$(OBJDIR) $(notdir $(SOURCECODE:.c=.o))
Run Code Online (Sandbox Code Playgroud)
然而,只有$(SOURCECODE)( ../ex/test.c) 中的第一个文件名被正确重命名为 obj/test.o,其余的看起来都像*.o,没有目录信息。
当我调试和优化我的一个 C/C++ 项目时,我经常禁用和启用-p -g -pg我的 Makefile 中的分析标志和一些优化标志,以便更好地了解发生了什么。
但是,GNU make没有检测到这种变化,也没有进行重新编译。
如何在不手动执行make clean?
我正在为一系列编译构建一个 Makefile,以显示用于与教程中的示例同步的渐进式输出差异。其中一些运行会生成错误代码,但由于这是“问题”定义的一部分,因此当目标失败时,由 make (“ Makefile:15: recipe for target `run3' failed ”)输出的消息有点进入道路。
我知道忽略错误代码,但是否可以抑制该输出?最好在 Makefile 中。
在类似的说明中,是否可以抑制从 Makefile 中进入和离开子目录的消息(相当于“--no-print-directory”)?
而且,是的,我对 GNU Make 的回答感到满意。
以下是我遇到的问题的简化生成文件:
all: /tmp/makey/../filey
@echo All done
/tmp/filey:
@echo Filey
Run Code Online (Sandbox Code Playgroud)
当我运行 make 它说:
make-3.79.1-p7: *没有规则来制作目标/tmp/makey/../filey', needed by全部的。停止。
显然它没有意识到 /tmp/makey/../filey 与 /tmp/filey 相同。我有什么想法可以使这项工作?
谢谢
乔——穆拉里
我有一个简单的示例 makefile 来显示我的问题:
.PHONY: a.out b.out
all: a.out b.out
common:
echo building common
sleep 1
touch common
a.out: common
echo building a.out
b.out: common
echo building b.out
Run Code Online (Sandbox Code Playgroud)
a.out & b.out 取决于 common,因此在进行并行构建时可能会出现竞争条件(common 生成两次)。
我确实 make -j4 并且没有遇到 common 被生成两次。我什至在 common 生成中添加了 sleep 语句,以使事情更具确定性。
那么可以说 GNU make 在构建公共依赖项时正确同步吗?
我正在尝试将一些复杂的makefile规则放在一起,以针对多个编译器自动构建项目.我有一个规则创建一些动态生成的变量并为它们分配变量,然后将这些变量传递给调用以构建单独的规则.
.PHONY: all
all:
@echo "Detected CPULIST:${CPULIST_DETECTED}"
@echo "CPULIST:${CPULIST}"
@for cpu in $(CPULIST_DETECTED); do \
echo "CPU:$${cpu}:"; \
eval VARIANTLIST_DETECTED=$(shell 2>&1 find ./.build/linux/$$cpu -mindepth 1 -maxdepth 1 | grep -v '\.svn' | grep -v warning ); \
eval echo "Detected Variant List:$${VARIANTLIST_DETECTED}"; \
eval variant_$${cpu}=$${cpu}; \
eval echo "variant_\$${cpu}:\$${variant_$${cpu}}"; \
$(MAKE) build CPULIST=$${cpu}; \
done
.PHONY: build
build: sanity_check $(TARGET)
@true
Run Code Online (Sandbox Code Playgroud)
我有两个问题.第一个是,尽管cpu通过双重转义$$cpu,它在行中转换为null:
eval VARIANTLIST_DETECTED=$(shell 2>&1 find ./.build/linux/$$cpu -mindepth 1 -maxdepth 1 | grep -v '\.svn' | …Run Code Online (Sandbox Code Playgroud) 我正在使用 GNU Make 3.81 版本。
从下面的例子中,我希望匹配任何模式(%:) 必须打印。而不是那个te%:已经执行。
有人可以解释一下,为什么目标' %: '没有运行?
这不匹配所有文件名吗?
生成文件:
all: test
echo $@
%:
echo 1: $@
te%:
echo 2: $@
Run Code Online (Sandbox Code Playgroud)
输出:
echo 2: test
2: test
echo all
all
Run Code Online (Sandbox Code Playgroud) 我想在Ubuntu 18.04上安装make 3.81。
因此,我下载了此版本的make并运行./configure,然后运行make。但是当编译它给我这个错误:
./glob/glob.c: In function ‘glob’:
./glob/glob.c:581:23: warning: implicit declaration of function ‘__alloca’; did you mean ‘alloca’? [-Wimplicit-function-declaration]
newp = (char *) __alloca (dirlen + 1);
^~~~~~~~
alloca
./glob/glob.c:581:14: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
newp = (char *) __alloca (dirlen + 1);
^
./glob/glob.c:709:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
newp = (char *) __alloca (home_len + dirlen);
^
./glob/glob.c:732:15: warning: cast to pointer from …Run Code Online (Sandbox Code Playgroud)