使用Make编译C

时间:2012-10-14 01:57:42

标签: c

我正在努力学习make,以便在学习C时使编译更容易。

我正在尝试:

gcc -Wall -g    3.c -o 3 -lm

使用

CC = gcc
CFLAGS = -Wall -g

clean:
        rm -f 3

但我不知道如何以及将-lm放在makefile中的位置。我在网上寻找过教程,但他们没有专门解决“-lm”选项,或者如果他们这样做的话没有什么解释,在我的情况下不起作用。

5 个答案:

答案 0 :(得分:2)

您需要一个“目标”来执行gcc命令。像:

CC = gcc
CFLAGS = -Wall -g

all:
    gcc -Wall -g 3.c -o 3 -lm

clean:
    rm -f 3

然后你可以用你的宏替换“all”命令的一部分;例如,CFLAGS可能会有“-lm”。

如果您运行“make -n”会有所帮助,它会告诉您如果要运行它会做什么。

答案 1 :(得分:2)

通常,您会在LIBS变量中看到特定于库的标志,例如:

CC = gcc
CFLAGS = -Wall -g -I/some/include/directory
LIBS = -lm -L/some/library/directory

all:
    $(CC) $(CFLAGS) $(LIBS) 3.c -o 3

答案 2 :(得分:2)

您要查找的变量名为LDLFAGS。来自§10.3 of the GNU Make manual

  

LDFLAGS

     

当编译器应该调用链接器时,给出编译器的额外标志,'ld'。

所以,只需:

LDFLAGS += -lm

希望它有所帮助。

答案 3 :(得分:0)

非常好的教程:Make Tutorial: How-To Write A Makefile

这是我写的一个很好的通用makefile:

http://pastebin.com/PCk0gNtE

您最感兴趣的部分将是此部分:

# C Preprocessor Flags
CPPFLAGS +=
# compiler flags
CFLAGS += -ansi -Wall -Wextra -pedantic-errors
# libraries to link to ( m == math )
program_LIBRARIES := m
# LDFLAGS is the variable to hold linker flags
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))

答案 4 :(得分:0)

GNU make定义了很多默认规则。对于C编译和链接,这些规则是:

n.o是从n.c自动生成的,其形式为'$(CC)$(CPPFLAGS)$(CFLAGS)-c'。

n是通过C编译器运行链接器(通常称为ld)从n.o自动生成的。使用的精确配方是'$(CC)$(LDFLAGS)n.o $(LOADLIBES)$(LDLIBS)'。

因此,向链接器添加“-lm”选项的方法是定义:

LDLIBS = -lm

然后当您使用Makefile运行make时,将运行以下命令:

gcc -Wall -g -c 3.c
gcc 3.o -o 3 -lm

(请注意,make将分两步编译您的C程序,首先创建目标文件3.o然后将目标文件链接到可执行文件3)

(请参阅http://www.gnu.org/software/make/manual/了解GNU制作手册)