ขณะนี้ฉันกำลังเรียนรู้วิธีการเขียนโค้ดโดยไม่ต้องใช้ IDE และฉันกำลังเรียนรู้วิธีเขียน makefiles นี่คือโครงการทดสอบปัจจุบันของฉัน:
\__ /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/ นี่คือไฟล์:
main.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
ฉันค้นหามาเกือบสองวันแล้วว่าจะแก้ไขข้อผิดพลาดเหล่านี้ได้อย่างไร
สำหรับอันแรก (คำจำกัดความหลักหลายคำ): ฉันได้ตรวจสอบตัวแปร OBJS แล้ว และมันมีและลิงก์เพียงครั้งเดียวที่ main.o แล้วทำไมถึงบอกว่า obj/cod/types.o
ในบรรทัดแรกล่ะ? ไม่มีหลักใน types.hpp/types.cpp
ข้อผิดพลาดที่สอง (การอ้างอิงที่ไม่ได้กำหนดถึง lol()): เหตุใดการอ้างอิงจึงไม่ได้กำหนดไว้ แต่ไม่มีข้อผิดพลาดของคอมไพเลอร์แทน
ข้อผิดพลาดที่สาม (สร้างใหม่ทุกอย่างทุกครั้ง แทนที่จะแก้ไขเฉพาะข้อผิดพลาดหรือแทนที่จะค้นหาไฟล์อ้างอิง .d)
ฉันกำลังใช้งาน MinGW32 build ล่าสุด (g++ 4.9.1) และ MSYS ล่าสุด (make)
ฉันทำอะไรผิดที่นี่?
{ "cmd":["make"], "path": "D:/DEV/MinGW/w32/mingw32/bin/;D:/DEV/msys/1.0/bin", "shell": true, }
- person nonsensation   schedule 01.08.2014