gpt4 book ai didi

c++ - Makefile: multiple definition and undefined reference 错误

转载 作者:太空宇宙 更新时间:2023-11-03 10:44:35 25 4
gpt4 key购买 nike

我目前正在学习如何在没有 IDE 的情况下进行编码,因此我正在学习如何编写 makefile。这是我当前的测试项目:

\__ /CoDstructor/
|\__ Makefile
|\__ /bin/
| \__ CoDstructor.exe
|\__ /src/
| \__ /cod/
| |\__ main.cpp
| |\__ types.cpp
| \__ types.hpp
\__ /obj/
\__ /cod/
|\__ main.o
|\__ main.d
|\__ types.o
\__ types.d

我只有一个顶级 makefile 来处理 src/目录中的每个模块,并在 obj/目录中创建对象和依赖文件。以下是文件:

主要.cpp

#include <iostream>
#include <cod/types.hpp>

int main() {
int s;
std::cin >> s;
return lol();
}

类型.hpp

#ifndef TYPES_HPP_INCLUDED
#define TYPES_HPP_INCLUDED

int lol();

#endif // TYPES_HPP_INCLUDED

类型.cpp

#include <iostream>
#include <cod/types.hpp>

int lol() {
std::cout << "lol";

return 0;
}

生成文件

APP_NAME = CoDstructor
DEBUG_TARGET = debug
RELEASE_TARGET = release
SRC_DIR = src
OBJ_DIR = obj
BIN_DIR = bin
INC_DIR = src

INCLUDE_DIRS +=

LIBRARY_DIRS +=

CXXFLAGS += -Wall
CXXFLAGS += -Werror
CXXFLAGS += -Wextra
CXXFLAGS += -pedantic
CXXFLAGS += -std=c++11

$(DEBUG_TARGET): CXXFLAGS += -g
$(RELEASE_TARGET): CXXFLAGS += -O3

LDFLAGS += -static
LDFLAGS += -static-libstdc++
LDFLAGS += -static-libgcc

$(DEBUG_TARGET): LDFLAGS += -g
$(RELEASE_TARGET): LDFLAGS +=

CPPMACROS =

$(DEBUG_TARGET): CPPMACROS += DEBUG
$(RELEASE_TARGET): CPPMACROS += NDEBUG

CXXFLAGS += $(foreach i,$(INC_DIR),$(addprefix -I,$(i)))
CXXFLAGS += $(foreach i,$(INCLUDE_DIRS),$(addprefix -I,$(i)))
CXXFLAGS += $(foreach i,$(CPPMACROS),$(addprefix -D,$(i)))

LIBS = $(foreach i,$(LIBRARY_DIRS),$(addprefix -L,$(i)))

SOURCES = $(subst ./,,$(shell find . -name *.cpp))
OBJS = $(subst $(SRC_DIR),$(OBJ_DIR),$(SOURCES:.cpp=.o))

DEPS = $(OBJS:.o=.d)

all: $(DEBUG_TARGET) clean

$(RELEASE_TARGET): $(BIN_DIR)/$(APP_NAME) clean
@echo Building release...

$(DEBUG_TARGET): $(BIN_DIR)/$(APP_NAME) clean
@echo Building debug...

$(OBJS): $(SOURCES)
@mkdir -p $(@D)
$(CXX) -MMD -MP $(CXXFLAGS) -c $< -o $@

$(BIN_DIR)/$(APP_NAME): $(OBJS)
$(CXX) $(LDFLAGS) $^ -o $@ $(LIBS)
@echo $^

.PHONY: clean

clean:
@echo clean
# @-rmdir $(OBJ_DIR)

-include $(DEPS)

这里是错误:

obj/cod/types.o: In function `main':
D:\PROJECTS\CoDstructor/src/cod/main.cpp:4: multiple definition of `main'
obj/cod/main.o:D:\PROJECTS\CoDstructor/src/cod/main.cpp:4: first defined here
obj/cod/main.o:main.cpp:(.text+0x2a): undefined reference to `lol()'
obj/cod/types.o:main.cpp:(.text+0x2a): undefined reference to `lol()'
collect2.exe: error: ld returned 1 exit status

我搜索了近两天如何解决这些错误。

对于第一个(main的多个定义):我已经检查了 OBJS 变量,它只包含并链接了一次 main.o。另外为什么在第一行说 obj/cod/types.otypes.hpp/types.cpp 中没有 main。

第二个错误(对 lol() 的 undefined reference ):为什么引用未定义,却没有给出编译器错误?

第三个错误(它每次都重建所有的东西,而不是只改变那些或者而不是查找 .d 依赖文件)

我正在运行最新的 MinGW32 版本 (g++ 4.9.1) 和最新的 MSYS (make)。

我在这里做错了什么?

最佳答案

你的 $(OBJS): $(SOURCES)规则不是你想的那样。结果,您同时构建了 main.otypes.o来自同一个main.cpp文件(命令行中的 $< 参数)。因此,您有两个相同的文件存在冲突,而 types.cpp甚至还没有建成。

正确的规则是 $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp

关于c++ - Makefile: multiple definition and undefined reference 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25085490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com