更改了文件的层级并尝试调整依赖关系,但 make 命令仍然不起作用

问题描述 投票:0回答:1

我的所有文件都在同一个文件夹中,一切都很好,现在我按照我认为正确的方式组织它,但现在我无法完成编译


this is the tree:
├── assembler.c
├── assembler_utils
│   ├── assembler_utils.c
│   ├── assembler_utils.h
├── error_handler
│   ├── error_handler.c
│   ├── error_handler.h
├── file_utils
│   ├── file_utils.c
│   ├── file_utils.h
├── first
│   ├── first_pass.c
│   ├── first_pass.h
├── globals.h
├── in_utils
│   ├── input_utils.c
│   ├── input_utils.h
├── makefile
├── management
│   ├── table_management.c
│   ├── table_management.h
├── pre
│   ├── pre_assembler.c
│   ├── pre_assembler.h
└── sec
    ├── second_pass.c
    ├── second_pass.h

我将文件中的所有包含内容更改为如下所示(示例): 之前:

#include "pre_assembler.h"
现在:
#inclue "../pre/pre_assembler.h"
(.. - 返回一个目录,然后转到正确的目录)

我运行命令以获得正确的编译命令:

gcc -MM assembler.c assembler_utils/assembler_utils.c error_handler/error_handler.c file_utils/file_utils.c first/first_pass.c in_utils/input_utils.c management/table_management.c pre/pre_assembler.c sec/second_pass.c

这就是 makefile 的样子:

CC = gcc
EXEC = assembler
OBJS = assembler.o assembler_utils/assembler_utils.o error_handler/error_handler.o file_utils/file_utils.o first/first_pass.o in_utils/input_utils.o pre/pre_assembler.o sec/second_pass.o management/table_management.o
COMP_FLAG = -ansi -Wall -pedantic
DEBUG_FLAG = -g

$(EXEC): $(OBJS)
    $(CC) $(COMP_FLAG) $(DEBUG_FLAG) $(OBJS) -o $@ -lm

assembler.o: assembler.c pre/pre_assembler.h \
 management/table_management.h globals.h first/first_pass.h \
 sec/second_pass.h file_utils/file_utils.h in_utils/input_utils.h
    $(CC) $(COMP_FLAG) $(DEBUG_FLAG) -c assembler.c -o assembler.o -lm

assembler_utils/assembler_utils.o: assembler_utils/assembler_utils.c \
 assembler_utils/assembler_utils.h globals.h
    $(CC) $(COMP_FLAG) $(DEBUG_FLAG) -c $< -o $@

error_handler/error_handler.o: error_handler/error_handler.c \
 error_handler/error_handler.h globals.h
    $(CC) $(COMP_FLAG) $(DEBUG_FLAG) -c $< -o $@

file_utils/file_utils.o: file_utils/file_utils.c \
 file_utils/file_utils.h globals.h management/table_management.h
    $(CC) $(COMP_FLAG) $(DEBUG_FLAG) -c $< -o $@

first/first_pass.o: first/first_pass.c first/first_pass.h \
 first/../globals.h management/table_management.h \
 in_utils/input_utils.h assembler_utils/assembler_utils.h
    $(CC) $(COMP_FLAG) $(DEBUG_FLAG) -c $< -o $@

in_utils/input_utils.o: in_utils/input_utils.c in_utils/input_utils.h \
 error_handler/error_handler.h globals.h
    $(CC) $(COMP_FLAG) $(DEBUG_FLAG) -c $< -o $@

pre/pre_assembler.o: pre/pre_assembler.c pre/pre_assembler.h \
 management/table_management.h globals.h in_utils/input_utils.h \
 file_utils/file_utils.h error_handler/error_handler.h \
 assembler_utils/assembler_utils.h
    $(CC) $(COMP_FLAG) $(DEBUG_FLAG) -c $< -o $@

sec/second_pass.o: sec/second_pass.c sec/second_pass.h \
 management/table_management.h globals.h in_utils/input_utils.h \
 error_handler/error_handler.h assembler_utils/assembler_utils.h
    $(CC) $(COMP_FLAG) $(DEBUG_FLAG) -c $< -o $@

management/table_management.o: management/table_management.c \
 management/table_management.h globals.h
    $(CC) $(COMP_FLAG) $(DEBUG_FLAG) -c $< -o $@

clean:
    -rm $(EXEC) $(OBJS)

我遇到问题,它声称我对同一函数有多个定义,但它指向第一个位置(例如):

/usr/bin/ld: first/first_pass.o: in function `is_valid_symbol_macro_name':
{path}/first/../assembler_utils/assembler_utils.c:50: multiple definition of `is_valid_symbol_macro_name'; {path}/assembler_utils/assembler_utils.c:50: first defined here

我尝试向 chatGPT 咨询 makefile 和我的文件,因为我没有看到任何问题,但他没有提供太多帮助

c gcc makefile
1个回答
0
投票

错误消息表明您对同一函数有两个定义。给出的一个源位置似乎很正常:

{path}/assembler_utils/assembler_utils.c:50
。但另一个有点令人惊讶:
{path}/first/../assembler_utils/assembler_utils.c:50
.

特别注意,这些似乎包含同一文件的两个不同路径。我在 makefile 中没有看到任何可以解释同一文件的多次编译的内容,但是您可以通过编译一个文件并将其放入您也编译的单独文件中来获得该效果。由于您必须在重组过程中修改您的

#include
语句,因此您似乎至少在一个地方做得不正确。
寻找您错误地

#include

而不是

#include "../assembler_utils/assembler_utils.c"
的地方。根据错误消息中给出的第二条路径的形式,您可能会在
#include "../assembler_utils/assembler_utils.h"
和/或
first/first_pass.c
 中找到错误
    

© www.soinside.com 2019 - 2024. All rights reserved.