编译程序时出错-数学库失败?

编译程序时出错-数学库失败?

我有 Ubuntu 服务器(无 GIU)版本 Ubuntu 16.04.3 LTS,并尝试安装程序“parsefsh-1.0-g231”。

我已经下载了文件并解压缩成功,现在我需要编译它,因此尝试了“make”,但出现以下错误。

gcc -Wall -Wextra -g -std=gnu99 -DHAVE_VLOG   -c -o projection.o projection.c
gcc -lm  parsefsh.o fshfunc.o projection.o   -o parsefsh
projection.o: In function `init_ellipsoid':
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:51: undefined reference to `pow'
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:51: undefined reference to `sqrt'
projection.o: In function `phi_rev_merc':
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:66: undefined reference to `sin'
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:67: undefined reference to `exp'
projection.o: In function `northing':
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:95: undefined reference to `tan'
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:95: undefined reference to `sin'
projection.o: In function `coord_diff':
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:111: undefined reference to `cos'
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:113: undefined reference to `atan2'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'parsefsh' failed
make: *** [parsefsh] Error 1

(还有更多具有不同数学函数的行,但我已将其删除以缩短此消息)

在我这个菜鸟看来,这是一个数学函数的问题,我在网上搜索了一下,发现有人建议我尝试以下方法...

gcc projection.c -o projection.o -lm

但这给了我一个错误

/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

现在我陷入了困境,在互联网上找不到任何其他答案,有人可以帮忙吗?

答案1

您的研究引导您走上了正确的道路。

检查软件的 Makefile 可知,创建目标的规则parsefish

parsefsh: parsefsh.o fshfunc.o projection.o

parsefsh.o: parsefsh.c fshfunc.h

fshfunc.o: fshfunc.c fshfunc.h

projection.o: projection.c projection.h

因为没有明确的行动对于这些规则,GNU Make 使用其内置规则. 对于编译阶段(.c.o),

$(CC) $(CPPFLAGS) $(CFLAGS) -c

考虑到 Makefile 的定义,它工作正常

CC = gcc
CFLAGS = -Wall -Wextra -g -std=gnu99 -DHAVE_VLOG

然而在链接阶段,规则的形式是

$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)

$(LDFLAGS)请注意目标代码文件n.o,而$(LOADLIBES)$(LDLIBS)位于其后。在 Makefile 中,只有LDFLAGS定义:

LDFLAGS = -lm

放在-lm了错误的位置(引用是从左到右解析的)。

最简单的解决办法就是简单地LDFLAGS = -lm改为LDLIBS = -lm

相关内容