2

我正在尝试学习 make 以使我在学习 C 时更容易编译。

我正在尝试做:

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

使用

CC = gcc
CFLAGS = -Wall -g

clean:
        rm -f 3

但我不知道如何以及在何处将 -lm 放入生成文件中。我已经在网上寻找教程,但他们没有专门解决“-lm”选项,或者如果他们这样做了,没有什么解释,并且在我的情况下不起作用。

4

5 回答 5

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”可能会有所帮助,它会告诉你如果运行它会做什么。

于 2012-10-14T02:02:31.777 回答
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
于 2012-10-14T02:03:40.263 回答
2

您要查找的变量称为LDLFAGS. 来自GNU Make 手册的 §10.3

LDFLAGS

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

因此,只需执行以下操作:

LDFLAGS += -lm

希望能帮助到你。

于 2012-10-14T02:06:18.507 回答
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))
于 2012-10-14T02:08:06.990 回答
0

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

no 由 nc 自动生成,配方形式为“$(CC) $(CPPFLAGS) $(CFLAGS) -c”。

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

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

LDLIBS = -lm

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

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

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

(有关 GNU make 手册,请参阅http://www.gnu.org/software/make/manual/ )

于 2012-10-14T02:25:06.857 回答