我正在写一个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时才能识别。你以前遇到过类似的问题吗?
答案 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
以匹配评论。