编译 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 错误的主要内容,如果未能解决你的问题,请参考以下文章

利用makefile实现c语言项目编译

使用makefile编译多个文件(.c , .cpp , .h等)

linux下make以及makefile

如何写 makefile

Makefile

编写编译规则文件Makefile,并通过make生成可执行文件