我刚开始学习makefile文件。我创建了一个由两个函数组成的程序,并希望使用makefile将它们放在一起。这是我的档案:
#Makefile
all: main
main: main.o find_root.o
clang -o main main.o find_root.o
main.o: main.c
clang -c -Wall --pedantic -std=c11 main.c -lm
find_root.o: find_root.c
clang -c -Wall --pedantic -std=c11 find_root.c -lm
clean: rm -f main *.o*
但是,当我运行它时,我收到一个错误 - “未定义的cos引用”。我在我的程序中使用余弦函数,但我已经将库链接到这两个文件的编译。我想在第一个clang选项中添加“-lm”。这导致没有错误,但它发出警告 - 说“-lm链接器未使用”。我应该在文件中更改什么?
答案 0 :(得分:3)
“-lm”是一个链接器选项,但您只在编译规则(main.o: main.c
)中包含它。您需要将其包含在链接器规则(main: main.o find_root.o
)中。
在编译过程中忽略-lm
选项并在链接期间丢失。
答案 1 :(得分:1)
编译时不使用链接器标志,但链接时,main
规则的命令应该是-lm
,而不是*.o
文件的命令。 / p>
更好的方法是设置适当的变量,让Make使用其内置规则:
#Makefile
LDLIBS += -lm
CFLAGS += -Wall --pedantic -std=c11
C = clang
all: main
main: main.o find_root.o
$(LINK.c) $^ $(LDLIBS) -o $@
clean:
$(RM) main *.o *~