c - Makefile .c + .as 与 ncurses

标签 c linux assembly makefile

我在编译程序以使用 ncurses 时遇到一些问题。我是创建 makefile 的新手,所以:

这是我的 makefile:

test_reservation: reservation.o service.o
    gcc -g -m32 service.o reservation.o -o test_reservation 
service.o: service.c
    gcc -g -m32 -c -o service.o service.c -std=c99 -lncurses
reservation.o: reservation.s
    as -gdbb --32 -o reservation.o reservation.s

我已经安装并包含在我的 c 文件中

当我试图做到这一点时:

gcc -g -m32 service.o reservation.o -o test_reseration
service.o: In function `main':
/home/xxx/reservationService/service.c:23: undefined reference to `initscr'
collect2: error: ld returned 1 exit status
makefile:2: recipe for target 'test_reservation' failed
make: *** [test_reservation] Error 1

这个 makefile 有什么问题?我该如何编译它?

最佳答案

这里有一个更好的 Makefile 框架供您引用:

PKGS    := ncursesw
CC      := gcc
CFLAGS  := -Wall -m32 -O2 -std=c99 $(shell pkg-config --cflags $(PKGS))
LDFLAGS := $(shell pkg-config --libs $(PKGS))
AS      := as
ASFLAGS := -gdbb --32
PROGS   := test-reservation

.PHONY: all clean

all: $(PROGS)

clean:
    $(RM) *.o $(PROGS)

%.o: %.c
    $(CC) $(CFLAGS) -c $^ -o $@

%.o: %.s
    $(AS) $(ASFLAGS) $^ -o $@

test-reservation: reservation.o service.o
    $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@

如果您复制粘贴以上内容,请记住运行 sed -e 's|^ *|\t|' -i Makefile修复缩进。

大多数 Linux 发行版使用 pkg-config跟踪编译特定库所需的选项。你只需要把你需要的包添加到 PKGS变量,用空格分隔。 ncursesw是支持宽字符的 ncurses 版本(您需要 Unicode 字符输出)。 $(shell pkg-config ... $(PKGS))习语使用 pkg-config shell 命令来提取正确的标志 ( --cflags ) 和库文件 ( --libs )。

如果您使用<math.h> ,你需要在前面加上 -lmLDFLAGS ;即LDFLAGS := -lm $(shell pkg-config --libs $(PKGS)) .

如果您在该目录中编译多个二进制文件,只需将最终的二进制文件名称添加到 PROGS ,并添加新规则,例如

foo-bin: foo.o bar.o baz.o
    $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@

规则操作不会改变,只有目标和先决条件发生变化。

all: $(PROGS)规则,你只需要运行make编译 PROGS 中命名的所有二进制文件。如果你修改说 service.c ,然后都是 service.otest-reservation将被重新编译。运行make clean all删除所有已编译的文件,然后重新编译它们。

关于c - Makefile .c + .as 与 ncurses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50494850/

相关文章:

python - 从外部操纵 Firefox 的 View

php - 更好的工具来管理 git merge 冲突 ssh 和 windows

c++ - 如何在 Linux 应用程序中独占使用附加键盘

assembly - 如果使用同一个寄存器分别作为输入和输出,两条指令能否在同一个周期内执行?

c - 为什么 crypt 函数在这里不起作用?

c# - 尝试导入非托管 dll 时 Pinvoke "System.AccessViolationException"

c - 函数指针 - 为什么这段代码会崩溃?

c - Lib(s)uinput : creating joystick with more than one button

string - 如何在 .COM 可执行文件中以相反顺序打印字符串?

assembly - 汇编器堆栈对齐(或使用 PUSH 更好的未对齐示例)