【发布时间】:2018-12-11 20:29:31
【问题描述】:
I've seen a project 使用asm 关键字作为变量名,并且代码可以使用Linux 上提供的Makefile 正常编译:
int
main(int ac, char *av[])
{
struct TMap *tm;
FILE *inf, *hf;
char *f, *sep;
int c, asm; // <---
asm = Defasm;
// ...
}
这是整个Makefile:
BIN = qbe
V = @
OBJDIR = obj
SRC = main.c util.c parse.c cfg.c mem.c ssa.c alias.c load.c copy.c \
fold.c live.c spill.c rega.c gas.c
AMD64SRC = amd64/targ.c amd64/sysv.c amd64/isel.c amd64/emit.c
ARM64SRC = arm64/targ.c arm64/abi.c arm64/isel.c arm64/emit.c
SRCALL = $(SRC) $(AMD64SRC) $(ARM64SRC)
AMD64OBJ = $(AMD64SRC:%.c=$(OBJDIR)/%.o)
ARM64OBJ = $(ARM64SRC:%.c=$(OBJDIR)/%.o)
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(AMD64OBJ) $(ARM64OBJ)
CFLAGS += -Wall -Wextra -std=c99 -g -pedantic
$(OBJDIR)/$(BIN): $(OBJ) $(OBJDIR)/timestamp
@test -z "$(V)" || echo "ld $@"
$(V)$(CC) $(LDFLAGS) $(OBJ) -o $@
$(OBJDIR)/%.o: %.c $(OBJDIR)/timestamp
@test -z "$(V)" || echo "cc $<"
$(V)$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR)/timestamp:
@mkdir -p $(OBJDIR)
@mkdir -p $(OBJDIR)/amd64
@mkdir -p $(OBJDIR)/arm64
@touch $@
$(OBJ): all.h ops.h
$(AMD64OBJ): amd64/all.h
$(ARM64OBJ): arm64/all.h
obj/main.o: config.h
config.h:
@case `uname` in \
*Darwin*) \
echo "#define Defasm Gasmacho"; \
echo "#define Deftgt T_amd64_sysv"; \
;; \
*) \
echo "#define Defasm Gaself"; \
case `uname -m` in \
*aarch64*) \
echo "$define Deftgt T_arm64"; \
;; \
*) \
echo "#define Deftgt T_amd64_sysv";\
;; \
esac \
;; \
esac > $@
install: $(OBJDIR)/$(BIN)
mkdir -p "$(DESTDIR)/$(PREFIX)/bin/"
cp $< "$(DESTDIR)/$(PREFIX)/bin/"
uninstall:
rm -f "$(DESTDIR)/$(PREFIX)/bin/$(BIN)"
clean:
rm -fr $(OBJDIR)
clean-gen: clean
rm -f config.h
check: $(OBJDIR)/$(BIN)
tools/test.sh all
check-arm64: $(OBJDIR)/$(BIN)
TARGET=arm64 tools/test.sh all
src:
@echo $(SRCALL)
80:
@for F in $(SRCALL); \
do \
awk "{ \
gsub(/\\t/, \" \"); \
if (length(\$$0) > $@) \
printf(\"$$F:%d: %s\\n\", NR, \$$0); \
}" < $$F; \
done
.PHONY: clean clean-gen check check-arm64 src 80 install uninstall
我想知道如何实现编译器将允许asm 作为变量名(忽略这样做是不好的风格的事实)。我尝试将Makefile 移植到CMakeLists.txt,但由于asm 的使用无效,编译器抛出了错误。如何在不更改代码的情况下解决此问题?我已经像 Makefile 那样强制使用 C99 标准并使用相同的 C 编译器标志,但这没有帮助:
cmake_minimum_required(VERSION 3.10.2)
project(qbe C)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_FLAGS "-Wall -Wextra -std=c99 -g -pedantic")
include_directories(amd64)
add_executable(qbe
amd64/all.h
amd64/emit.c
amd64/isel.c
amd64/sysv.c
amd64/targ.c
alias.c
all.h
cfg.c
copy.c
fold.c
gas.c
live.c
load.c
main.c
mem.c
ops.h
parse.c
rega.c
spill.c
ssa.c
util.c)
由于IDE 的支持,我想使用CMake。
【问题讨论】:
-
-std=c99对于gcc应该足够了(它适用于我)。你使用的是什么版本的gcc?你能显示cmake给gcc的实际命令行吗? -
通过快速测试,gcc has no problem with this,而g++ is more picky about it(可能
asm是仅在C 中的保留关键字)。可能您的 cmake 甚至试图使用 g++ 来编译 C 文件?尝试使用make VERBOSE=1来查看它正在调用哪些命令。 -
CMake 默认启用编译器扩展;您要的是 gnu99 模式,而不是 c99。有关如何关闭此功能以及设置要使用的 C 版本的正确方法,请参阅 cmake.org/cmake/help/latest/manual/… 和 cmake.org/cmake/help/latest/prop_tgt/… 和 cmake.org/cmake/help/latest/prop_tgt/…
-
@MatteoItalia:您的选项包括
-std=c99,它选择标准C而不是GCC的默认值,在这种情况下会抱怨asm。 -
@EricPostpischil:是的,他们包含它,因为 OP 将它包含在 Makefile 和 CMakeLists.txt 的标志中......
标签: c assembly makefile cmake keyword