我正在编写一个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页面的各种教程,但我仍然陷入困境。如果您有任何解决此问题的建议,请告诉我。谢谢!
编辑:在乔纳森·勒夫勒的建议之后
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
我知道只有在使用make时,它才能识别出在program_1.c中使用的GNU GSL库。您以前是否遇到过类似的问题?
如果您已正确编写了代码,并使用#include <gsl/gsl_XXXXX.h>
了包括GSL标头的符号(如GSL(GNU科学库)文档中的示例程序中所述),则不需要该-I /usr/include/gsl
选项-除非您隐藏了GSL/usr/include/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
以匹配注释。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句