【发布时间】:2015-12-31 04:28:00
【问题描述】:
我正在使用 Ubuntu 14.04 运行 32 位机器。我想执行sudo make 来生成一个C++ 编译文件(gcc-4.8.4)。我的 Makefile 是
Makefile(基于 ddumbugie 的 cmets 编辑):
CDefines = -DLINUXGXX
COMPFLAGS =
FlameManCC = gcc
FlameManCCOpts = -O3
OBJECTS = alligator.o
COpts = $(COMPFLAGS) $(FlameManCCOpts) $(CDefines)
CC = $(FlameManCC)
alligator.o: alligator.c
$(CC) $(COpts) -c $< -o $@
执行
make -n
给我
gcc -O3 -DLINUXGXX -c alligator.c -o alligator.o
但是
sudo make -n
给我
DLINUXGXX -c alligator.c -o alligator.o
肯定是命令 LINUXGXX 不理解。但是,对于 make 执行的后续命令,我需要保持超级用户身份。我该如何解决这个问题?
【问题讨论】:
-
你是如何运行
make的? -
我是新手。我只是用make,Makefile就是上面的文件
-
从表面上看,
sudo make -n的行为就像CC或FlameManCC宏设置为空,而FlameManCCOpts宏设置为空。看看这是怎么发生的有点棘手。有一个MAKEFLAGS环境变量和一个选项-e提供环境优先级。如果 root 特权环境设置了这些,以便空环境变量优先于 makefile 中的内容,那么您可以看到您所看到的结果(-DLINUXGXX中缺少的-是因为 make 将-在命令的开头作为“忽略错误”)。 […] -
[…continuation…] 但是说“这有点牵强”是有礼貌的。我建议进一步调试,你应该做
sudo bash或附近,并检查环境。您可能需要在 makefile 中执行此操作(添加一条规则:dumpenv: ; env,它可以在有分号的情况下全部放在一行上,也可以在没有分号的情况下分成两行)。我还将观察到您应该尽可能少地使用 root。如果安装目录受到保护,可以运行sudo make install。但是你不应该经常需要以root运行编译。 -
@JonathanLeffler 感谢您的详细评论。我会用 sudo bash 跟进调试
标签: makefile