我正在努力学习make,以便在学习C时使编译更容易。
我正在尝试:
gcc -Wall -g 3.c -o 3 -lm
使用
CC = gcc
CFLAGS = -Wall -g
clean:
rm -f 3
但我不知道如何以及将-lm放在makefile中的位置。我在网上寻找过教程,但他们没有专门解决“-lm”选项,或者如果他们这样做的话没有什么解释,在我的情况下不起作用。
答案 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:
您最感兴趣的部分将是此部分:
# 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制作手册)