【问题标题】:Makefile: "undefined reference to cos"Makefile:“未定义对 cos 的引用”
【发布时间】:2018-05-25 22:43:40
【问题描述】:

我刚刚开始学习 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链接器未使用”。我应该在我的文件中更改什么?

【问题讨论】:

  • 在创建目标文件时不链接库,而是在创建(和链接)可执行文件时。
  • 删除所有-lms,然后将clang -o main main.o find_root.o更改为clang -lm -o main main.o find_root.o
  • @MichaelWalz 我不确定clang,但对于某些链接器前端,您需要将-lm 选项放在.o 文件之后,如下所示:clang -o main main.o find_root.o -lm。跨度>
  • Makefile 中的clean: 规则有错误。它当前具有目标依赖项应该去的规则的命令部分。将rm 命令移到下一行,缩进,以修复它。

标签: c makefile clang


【解决方案1】:

“-lm”是一个链接器选项,但您只将它包含在编译规则中 (main.o: main.c)。您需要将其包含在链接器规则中 (main: main.o find_root.o)。

就目前而言,-lm 选项在编译过程中被忽略,在链接过程中丢失。

【讨论】:

    【解决方案2】:

    编译时不使用链接器标志,而是在链接时使用,因此main 规则的命令应该有-lm,而不是*.o 文件的命令。

    最好只设置适当的变量,并让 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 *~
    

    【讨论】:

      猜你喜欢
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      相关资源
      最近更新 更多