为什么在使用 makefile 时会收到未定义的引用错误?
Why while using makefile I receive undefined reference error?
我创建了以下 makefile:
assembler: main.o first_pass.o second_pass.o helpers.o data_array.o symbol_table.o
gcc -Wall -ansi -pedantic main.o first_pass.o second_pass.o helpers.o data_array.o symbol_table.o -o assembler
main.o: main.c header.h
gcc -Wall -ansi -pedantic main.c -o main.o
first_pass.o: first_pass.c header.h
gcc -Wall -ansi -pedantic first_pass.c -o first_pass.o
second_pass.o: second_pass.c header.h
gcc -Wall -ansi -pedantic second_pass.c -o second_pass.o
helpers.o: helpers.c header.h data.h
gcc -Wall -ansi -pedantic helpers.c -o helpers.o
data_array.o: data_array.c header.h data.h
gcc -Wall -ansi -pedantic data_array.c -o data_array.o
symbol_table.o: symbol_table.c header.h data.h
gcc -Wall -ansi -pedantic symbol_table.c -o symbol_table.o
在我的 'main.c' 文件中有 #include "header.h"
。在 'header.h' 中,我有所有函数的声明。
但是我收到以下错误:
gcc -Wall -ansi -pedantic main.c -o main.o
/tmp/cc3dP7hx.o: In function `main':
main.c:(.text+0x257): undefined reference to `first_pass`
main.c:(.text+0x2e4): undefined reference to `second_pass'
main.c:(.text+0x37f): undefined reference to build_obj_file
main.c:(.text+0x3a9): undefined reference to build_ent_file
main.c:(.text+0x427): undefined reference to free_all_data
main.c:(.text+0x436): undefined reference to free_all_symbols
main.c:(.text+0x44d): undefined reference to free_all_words
collect2: error: ld returned 1 exit status
makefile:4: recipe for target 'main.o' failed
make: *** [main.o] Error 1
问题是您的命令不创建目标文件,而是尝试构建可执行程序:
gcc -Wall -ansi -pedantic main.c -o main.o
您需要 -c
选项来创建目标文件:
gcc -Wall -pedantic main.c -c -o main.o
一个更好的主意是依赖 make
implicit rules 这样您就不必明确列出所有命令:
CC = gcc
LD = gcc
CFLAGS = -Wall -pedantic
LDFLAGS =
assembler: main.o first_pass.o second_pass.o helpers.o data_array.o symbol_table.o
您可能想要为头文件依赖项添加规则,或者找出一些自动生成它们的方法(这是可能的)。除此之外 Makefile
应该足以构建所有目标文件,然后 link 它们一起进入 assembler
可执行程序。
请注意,我已经删除了 -ansi
标志,因为现在它基本上已经过时了。
我创建了以下 makefile:
assembler: main.o first_pass.o second_pass.o helpers.o data_array.o symbol_table.o
gcc -Wall -ansi -pedantic main.o first_pass.o second_pass.o helpers.o data_array.o symbol_table.o -o assembler
main.o: main.c header.h
gcc -Wall -ansi -pedantic main.c -o main.o
first_pass.o: first_pass.c header.h
gcc -Wall -ansi -pedantic first_pass.c -o first_pass.o
second_pass.o: second_pass.c header.h
gcc -Wall -ansi -pedantic second_pass.c -o second_pass.o
helpers.o: helpers.c header.h data.h
gcc -Wall -ansi -pedantic helpers.c -o helpers.o
data_array.o: data_array.c header.h data.h
gcc -Wall -ansi -pedantic data_array.c -o data_array.o
symbol_table.o: symbol_table.c header.h data.h
gcc -Wall -ansi -pedantic symbol_table.c -o symbol_table.o
在我的 'main.c' 文件中有 #include "header.h"
。在 'header.h' 中,我有所有函数的声明。
但是我收到以下错误:
gcc -Wall -ansi -pedantic main.c -o main.o
/tmp/cc3dP7hx.o: In function `main':
main.c:(.text+0x257): undefined reference to `first_pass`
main.c:(.text+0x2e4): undefined reference to `second_pass'
main.c:(.text+0x37f): undefined reference to build_obj_file
main.c:(.text+0x3a9): undefined reference to build_ent_file
main.c:(.text+0x427): undefined reference to free_all_data
main.c:(.text+0x436): undefined reference to free_all_symbols
main.c:(.text+0x44d): undefined reference to free_all_words
collect2: error: ld returned 1 exit status
makefile:4: recipe for target 'main.o' failed
make: *** [main.o] Error 1
问题是您的命令不创建目标文件,而是尝试构建可执行程序:
gcc -Wall -ansi -pedantic main.c -o main.o
您需要 -c
选项来创建目标文件:
gcc -Wall -pedantic main.c -c -o main.o
一个更好的主意是依赖 make
implicit rules 这样您就不必明确列出所有命令:
CC = gcc
LD = gcc
CFLAGS = -Wall -pedantic
LDFLAGS =
assembler: main.o first_pass.o second_pass.o helpers.o data_array.o symbol_table.o
您可能想要为头文件依赖项添加规则,或者找出一些自动生成它们的方法(这是可能的)。除此之外 Makefile
应该足以构建所有目标文件,然后 link 它们一起进入 assembler
可执行程序。
请注意,我已经删除了 -ansi
标志,因为现在它基本上已经过时了。