make:没有什么可以为'all' make文件的错误

时间:2015-08-08 03:45:26

标签: c makefile

我正在写一个make文件来运行它:

gcc program_1.c -lgsl -lgslcblas -o program_1
./program_1

这是我的makefile

CC=gcc
CFLAGS=-c -Wall
LDFLAGS=-g 
LIBS= -lgsl -lgslblas
SOURCES=program_1.c
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=program_1

all: $(SOURCES) $(EXECUTABLE)
        ./$(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
        $(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $@

.c.o:
        $(CC) $(CFLAGS) $< -o $@

但是,我在运行make时遇到此错误:

make: Nothing to be done for `all'.

我阅读了关于makefile和man make页面的各种教程,但我仍然卡住了。如果您有任何建议可以解决此问题,请与我们联系。谢谢!

编辑: 在Jonathan Leffler的建议之后

gcc -I/usr/include/gsl program_1.c -o program_1.o
/tmp/ccLJo81U.o: In function `main':
program_1.c:(.text+0xb1): undefined reference to `gsl_matrix_view_array'
program_1.c:(.text+0xce): undefined reference to `gsl_matrix_view_array'
program_1.c:(.text+0xd8): undefined reference to `gsl_permutation_alloc'
program_1.c:(.text+0x128): undefined reference to `gsl_matrix_get'
program_1.c:(.text+0x1b6): undefined reference to `gsl_linalg_LU_decomp'
program_1:(.text+0x1d6): undefined reference to `gsl_linalg_LU_invert'
program_1.c:(.text+0x21f): undefined reference to `gsl_matrix_get'
program_1.c:(.text+0x29c): undefined reference to `gsl_permutation_free'
collect2: error: ld returned 1 exit status
make: *** [program_1.o] Error 1

我知道它无法识别我在program_1.c中使用过的GNU GSL库,只有在我使用make时才能识别。你以前遇到过类似的问题吗?

1 个答案:

答案 0 :(得分:1)

如果您已正确编写代码,请使用#include <gsl/gsl_XXXXX.h>等符号来包含GSL标头(如GSL中的example program - GNU Scientific Library - 文档中所述),那么您就不会需要-I /usr/include/gsl选项 - 除非您在/usr/include/gsl/gsl目录中隐藏了GSL标题,这似乎不太可能。

你的makefile大概应该是:

CC      = gcc
CFLAGS  = -g -Wall
LDFLAGS = 
LDLIBS  = -lgsl -lgslcblas
SOURCES = program_1.c
OBJECTS = $(SOURCES:.c=.o)
PROGRAM = program_1

all: $(SOURCES) $(PROGRAM)
        ./$(PROGRAM)

$(PROGRAM): $(OBJECTS)
        $(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) $(LDLIBS) -o $@

这非常接近你所拥有的。我已将EXECUTABLE重命名为PROGRAM,以便主要名称长度相同(愚蠢,但......)。我删除了.c.o规则,因为make已经知道如何将C代码编译为目标文件并使用类似于您显示的规则 - 内置规则包含显式-c标记,你目前失踪了。

链接行包含CFLAGS,CFLAGS包含-g选项,用于在构建中包含调试信息。

您已经在目标文件之后包含了库;这很重要也很正确。

将图书馆名称更新为-lgslcblas以匹配评论。