编译 C 代码时的 Makefile 错误
Posted
技术标签:
【中文标题】编译 C 代码时的 Makefile 错误【英文标题】:Makefile error when when compileing C code 【发布时间】:2017-03-03 08:24:54 【问题描述】:我下载了 Cubist 软件的单线程 Linux 版本的 C 源代码。代码所做的是获取输入数据并生成回归树模型。
使用 Ubuntu 终端编译源代码时,它生成的可执行文件没有错误。 这是makefile
CC = gcc -ffloat-store
OFLAGS = -O3
CFLAGS = -DVerbOpt -g -Wall -O0
LFLAGS = $(S)
SHELL = /bin/csh
src =\
global.c\
xval.c\
cubist.c\
sort.c\
construct.c\
predict.c\
stats.c\
discr.c\
rules.c\
contin.c\
formrules.c\
formtree.c\
getdata.c\
getnames.c\
implicitatt.c\
instance.c\
modelfiles.c\
prunetree.c\
regress.c\
trees.c\
update.c\
utility.c
obj =\
global.o cubist.o construct.o\
formtree.o prunetree.o stats.o discr.o contin.o\
trees.o\
formrules.o rules.o\
instance.o\
predict.o\
regress.o\
xval.o\
getnames.o getdata.o implicitatt.o sort.o\
modelfiles.o\
update.o utility.o\
all:
make cubist
$(CC) $(LFLAGS) $(OFLAGS) -o summary summary.c -lm
# debug version (including verbosity option)
cubistdbg:\
$(obj) defns.i extern.i text.i Makefile
$(CC) $(CFLAGS) -o cubistdbg $(obj) -lm
# production version
cubist:\
$(src) defns.i text.i Makefile
cat defns.i $(src)\
| egrep -v 'defns.i|extern.i' >cubistgt.c
$(CC) $(LFLAGS) $(OFLAGS) -o cubist cubistgt.c -lm
strip cubist
rm cubistgt.c
$(obj): Makefile defns.i extern.i text.i
.c.o:
$(CC) $(CFLAGS) -c $<
当我尝试在 Windows 中做类似的工作时,我收到了错误消息
$ make all
make cubist
make: /bin/csh: Command not found
make: *** [Makefile:56: all] Error 127
但是当我尝试从 Makefile 中删除 SHELL = /bin/csh 时,它起作用了。我的问题是它对软件有负面影响吗? 我如何在不删除 SHELL = /bin/csh 的情况下修复它。 非常感谢
【问题讨论】:
所以你说你下载了 Linux 软件但它在 windows 上不起作用?我做对了吗? “类似的工作”是什么意思。您正在尝试在 Windows shell 中针对 Linux 源代码使用make
?你确实意识到,如果源代码是为 Linux 设计的,它可能取决于某些东西,也许是系统的几十个特性?你知道csh是什么吗?我问是因为我可能对情况的评估是错误的。但我认为你对自己在做什么一无所知。
我看不出这个具体示例中的SHELL
设置会影响任何事情。
@szpanczyk 这似乎是一个 cli 数学程序。为什么不能在 Windows 和 Linux 上运行?
当我说类似的工作时,它的意思是“在 windows::: 中使用 CYGWIN 编译 make 实际上 CYGWIN 中的 make 命令创建了可执行文件,但我需要知道的是删除 SHELL = /bin /csh 影响源代码???坦率地说我不知道 csh 是什么意思。
【参考方案1】:
我的猜测是,通过删除行 SHELL = /bin/csh
你的结果是好的。
/bin/csh
是一个主要用于 unix 的 shell(命令行界面、命令处理器、命令提示符)。在您的 makefile 中已定义,但未引用(未使用)。
有时,makefile 可能需要一个 shell(命令处理器)来执行某些任务,但这取决于 makefile - 我的意思是,编写 makefile 的人选择是否使用该功能,如果使用,可以(或必须)指定要使用的外壳。这不是你的情况,现在。
【讨论】:
以上是关于编译 C 代码时的 Makefile 错误的主要内容,如果未能解决你的问题,请参考以下文章