【问题标题】:undefined reference to 'sqrt' when trying to use make command尝试使用 make 命令时未定义对“sqrt”的引用
【发布时间】:2016-03-29 08:28:13
【问题描述】:

我一直在尝试编译一些代码,这些代码允许我将 gcode 转换为 x3g 用于我的 3d 打印机,但每当我尝试运行“make”时,它都会向我抛出以下内容。

sudo make
[sudo] password for kipinaac: 
cc -c -w getopt.c -o getopt.o
cc -c -w gpx.c -o gpx.o
cc -c -w gpx-main.c -o gpx-main.o
cc -lm getopt.o gpx.o gpx-main.o -o gpx
gpx.o: In function `magnitude':
gpx.c:(.text+0x1c1f): undefined reference to `sqrt'
gpx.o: In function `mm_to_steps':
gpx.c:(.text+0x224d): undefined reference to `round'
gpx.c:(.text+0x2274): undefined reference to `round'
gpx.c:(.text+0x229b): undefined reference to `round'
gpx.c:(.text+0x22ef): undefined reference to `round'
gpx.c:(.text+0x2353): undefined reference to `round'
gpx.o:gpx.c:(.text+0x2397): more undefined references to `round' follow
collect2: error: ld returned 1 exit status
make: *** [gpx] Error 1

我检查以确保在 gpx.c 中也有引用。我发现它可能与来自其他一些线程的链接有关,但它们都显式调用 gcc 而不是使用 make。另外,需要明确的是,已经提供了一个 Makefile。

【问题讨论】:

  • 目标文件之后的库 (-lm)。把-lm移到最后就OK了。
  • 我编辑了 Makefile 以在目标文件之后包含库,并且编译正确。 Makefile 是在 Github 上提供的,并且有许多视频显示成功安装,所以有些东西告诉我,如果没有这一步,它应该可以工作。有什么想法吗?
  • 它只是偶然工作的——某些版本的 GCC 及其链接器会在任何目标文件之前记录列出的库的内容;其他人(包括您的)只有在它提供了在扫描时需要提供的任何符号时才会使用该库。当库位于目标文件之前时,它不满足链接器正在寻找的唯一符号——main——因此它被视为无关紧要而被忽略。唯一安全的工作方式是“目标文件之后的库”。这适用于静态库和共享库,以及两种样式的链接器。

标签: reference makefile undefined gpx


【解决方案1】:

将 cmets 转移到答案以允许结束问题。

将库 (-lm) 放在命令行上的目标文件之后。把-lm移到最后就OK了。

我编辑了 Makefile 以在目标文件之后包含库,并且它编译正确。 Makefile 是在 Github 上提供的,并且有许多视频显示成功安装,所以有些东西告诉我,如果没有这一步,它应该可以工作。有什么想法吗?

它只是偶然起作用——某些版本的 GCC 及其链接器会在任何目标文件之前记录列出的库的内容;其他人(包括您的)只有在它提供了在扫描时需要提供的任何符号时才会使用该库。当库位于目标文件之前时,它不满足链接器正在寻找的唯一符号——main——因此它被忽略为无关紧要。唯一安全的工作方式是“目标文件之后的库”。这适用于静态库和共享库,以及两种样式的链接器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2015-02-13
    • 1970-01-01
    • 2021-06-18
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多