【发布时间】: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