c - 使: Nothing to be done for `all' error for make file

标签 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 页面的各种教程,但我仍然陷入困境。如果您有任何解决此问题的建议,请告诉我。谢谢!

编辑: 根据乔纳森·莱夫勒的建议

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 header (如 GSL — GNU Scientific Library — 文档中 example program 中所述),那么您不需要 -I /usr/include/gsl选项 — 除非您已隐藏 /usr/include/gsl/gsl 中的 GSL header 目录,这似乎有点不太可能。

你的 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 $@

这与您所得到的非常接近。我已重命名EXECUTABLEPROGRAM这样主要名称的长度就相同(愚蠢,但是……)。我删除了.c.o规则自 make已经知道如何将 C 代码编译为目标文件并使用类似于您所显示的规则 - 内置规则包括显式 -c标志,您目前缺少该标志。

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

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

库名称已更新为 -lgslcblas匹配评论。

关于c - 使: Nothing to be done for `all' error for make file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31889424/

相关文章:

c++ - 我的 MakeFile 找不到我的头目录

c - 如何修复从 C 中的函数传递指针的段错误?

c - 使用 gdb 检查调用者帧

c - 未经压缩的 bsdiff 会生成大增量补丁文件

c - 为什么 fork() 返回该组合中所有可能的输出?

c - 两个客户端之间异步传输消息

c++ - 在 Cmake 中将 flto=jobserver 传递给 gcc

c++ - Makefile 中的 "Optional"目标文件目标?

gcc - 构建 gcc 4.6 时遇到问题 : undefined reference to `yylex'

c++ - 在 32 位平台上编译 OpenSSL 1.1.1g。 MSYS2 - 失败