【问题标题】:Make compiler options制作编译器选项
【发布时间】: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 的行为就像 CCFlameManCC 宏设置为空,而FlameManCCOpts 宏设置为空。看看这是怎么发生的有点棘手。有一个 MAKEFLAGS 环境变量和一个选项 -e 提供环境优先级。如果 root 特权环境设置了这些,以便空环境变量优先于 makefile 中的内容,那么您可以看到您所看到的结果(-DLINUXGXX 中缺少的 - 是因为 make 将 -在命令的开头作为“忽略错误”)。 […]
  • […continuation…] 但是说“这有点牵强”是有礼貌的。我建议进一步调试,你应该做sudo bash或附近,并检查环境。您可能需要在 makefile 中执行此操作(添加一条规则:dumpenv: ; env,它可以在有分号的情况下全部放在一行上,也可以在没有分号的情况下分成两行)。我还将观察到您应该尽可能少地使用 root。如果安装目录受到保护,可以运行sudo make install。但是你不应该经常需要以root 运行编译。
  • @JonathanLeffler 感谢您的详细评论。我会用 sudo bash 跟进调试

标签: makefile


【解决方案1】:
CDefines = -DLINUXGXX
COpts = -O3 $(CDefines)
alligator.o: alligator.c
    $(CC) $(COpts) -c $< -o $@

它需要-o 编译器选项。

  • $@ 表示目标。那是alligator.o
  • $&lt; 表示依赖。那是alligator.c

【讨论】:

  • 谢谢!是否有理由必须提供 -o 选项并添加 $
  • -o 一定不是必需的!但我展示了常见的用法。请查看更复杂的 makefile 示例。顺便说一句,您收到的错误消息是否正确?使用哪个版本的 make?
  • 我使用的是 make 3.81。请参阅我的问题的编辑。我认为这是make和sudo make之间的区别。对此有任何指示吗?
猜你喜欢
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多