【问题标题】:compiling ncurses code with gcc -lncurses flag seems to not be working使用 gcc -lncurses 标志编译 ncurses 代码似乎不起作用
【发布时间】:2012-12-22 01:16:01
【问题描述】:

我正在使用 ncurses 编写基于终端的俄罗斯方块游戏。我已将所有 ncurses 代码分离到一个名为 tetrisUI.c 的文件中,我在我的 main.c 源文件中包含了一个头文件。当我编译所有 ncurses 函数时,会引发编译器错误。我在源文件中包含了 ncurses.h,并且在 gcc 中使用了 -lncurses 标志。我正在从具有以下内容的 makefile 进行编译:

Tetris : tetris.o main.o tetrisUI.o
    gcc tetris.o main.o tetrisUI.o -o Tetris

tetrisUI.o : tetrisUI.c
    gcc -std=c99 -c tetrisUI.c -lncurses

tetris.o : tetris.c tetris.h
    gcc -std=c99 -c tetris.c

main.o : main.c tetris.h tetrisUI.h
    gcc -std=c99 -c main.c

我能够使用 ncurses 编译一些简短的测试程序就好了。这是我第一次尝试使用 ncurses 和我的第一个重要的 c 程序(我在学校做过一点 c++)。我有一种预感,我的问题与我的 makefile 有关,但我也不擅长使用这些。

【问题讨论】:

    标签: c++ c linux gcc ncurses


    【解决方案1】:

    在链接阶段而不是在编译阶段使用-lncurses

    gcc tetris.o main.o tetrisUI.o -o Tetris -lncurses
    

    【讨论】:

    • 嗯,它现在看起来正在编译和链接。我希望我可以说我的程序实际上正在运行,但这是另一个话题。
    【解决方案2】:

    您可以使用默认的宏和规则来简化您的 Makefile:

    CFLAGS = -std=c99   # C compiler flags
    LDLIBS = -lcurses   # curses
    
    Tetris : tetris.o main.o tetrisUI.o  # make does a "$(CC) $(CFLAGS) -o $@ $^ $(LDLIBS)" on its own
    

    这就是你所需要的。以下定义和规则可以完全省略 - make 默认做正确的事:

    CC     = gcc        # C compiler name
    
    tetrisUI.o : tetrisUI.c  tetrisUI.h # make does a "$(CC) $(CFLAGS) -o $@ $<" on its own
    
    tetris.o : tetris.c tetris.h
    
    main.o : main.c tetris.h tetrisUI.h
    

    解释一下:$@ 是正在构建的东西,$&lt; 是第一个依赖项,$^ 是所有依赖项。明智地使用它可以减少打字(以及更少的愚蠢错误,您添加一个依赖项而不处理它;或省略一个依赖项(因此如果它发生更改,请不要重做构建))。看看 make 手册,如果你有 GNU make,它的 info 文件有很多详细的例子和提示。

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2011-09-19
      • 2010-12-03
      • 1970-01-01
      相关资源
      最近更新 更多