我正在尝试学习 make 以使我在学习 C 时更容易编译。
我正在尝试做:
gcc -Wall -g 3.c -o 3 -lm
使用
CC = gcc
CFLAGS = -Wall -g
clean:
rm -f 3
但我不知道如何以及在何处将 -lm 放入生成文件中。我已经在网上寻找教程,但他们没有专门解决“-lm”选项,或者如果他们这样做了,没有什么解释,并且在我的情况下不起作用。
我正在尝试学习 make 以使我在学习 C 时更容易编译。
我正在尝试做:
gcc -Wall -g 3.c -o 3 -lm
使用
CC = gcc
CFLAGS = -Wall -g
clean:
rm -f 3
但我不知道如何以及在何处将 -lm 放入生成文件中。我已经在网上寻找教程,但他们没有专门解决“-lm”选项,或者如果他们这样做了,没有什么解释,并且在我的情况下不起作用。
您需要一个“目标”来执行 gcc 命令。像:
CC = gcc
CFLAGS = -Wall -g
all:
gcc -Wall -g 3.c -o 3 -lm
clean:
rm -f 3
然后你可以用你的宏替换“all”命令的一部分;例如,CFLAGS 可能会有“-lm”。
如果你运行“make -n”可能会有所帮助,它会告诉你如果运行它会做什么。
LIBS
通常,您会在变量中看到库特定的标志,例如:
CC = gcc
CFLAGS = -Wall -g -I/some/include/directory
LIBS = -lm -L/some/library/directory
all:
$(CC) $(CFLAGS) $(LIBS) 3.c -o 3
您要查找的变量称为LDLFAGS
. 来自GNU Make 手册的 §10.3:
LDFLAGS
当编译器应该调用链接器'ld'时提供给编译器的额外标志。
因此,只需执行以下操作:
LDFLAGS += -lm
希望能帮助到你。
一个非常好的教程: 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))
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/ )