У меня возникают проблемы с тем, что мой Makefile работает для простого проекта C++. Ошибка, которую я получаю
"фатальная ошибка: нет входных файлов"
Вот моя структура проекта:
ROOT
|
|___Makefile
|
|___bin
|
|___src
| |
| |___main.cpp
|
|___include
|
|___GL
| |
| |___glew.h
| |___glfw3.h
|
|___glm
|
|___glm.hpp
И вот мой Makefile:
CC = g++
INC_DIR1 = include/GL
INC_DIR2 = include/glm
SRC_DIR = src
OBJ_DIR = bin
CFLAGS = -c -Wall -I
SRCS = $(SRC_DIR)/main.cpp
OBJS = $(OBJ_DIR)/main.o
DEPS = $(INC_DIR1)/glew.h $(INC_DIR1)/glfw3.h $(INC_DIR2)/glm.hpp
EXECUTABLE = game
all: $(OBJS) $(EXECUTABLE)
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp
$(CC) $(CFLAGS) $< -o $@
$(EXECUTABLE): $(OBJS)
$(CC) $(OBJS) -o $@
$(OBJ_DIR)/main.o: $(DEPS)
Я не уверен, пытается ли он найти файлы.ccp для файлов заголовков или если я неправильно установил свой Makefile. Я новичок в Makefiles, поэтому любое понимание было бы очень оценено.
Благодарю.
Поэтому я смог решить большинство проблем, которые у меня были, но теперь я получаю следующую ошибку, когда пытаюсь сделать свою программу через командную строку:
:multiple definition of 'main'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../..\libmingw32.a(main.o):main.c:(.tex
t.startup+0x0): first defined here
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../..\libmingw32.a(main.o):main.c:(.tex
t.startup+0xa7): undefined reference to 'WinMain@16'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: c:/mingw/b
in/../lib/gcc/mingw32/4.8.1/../../..\libmingw32.a(main.o): bad reloc address 0x2
0 in section '.eh_frame'
collect2.exe: error: ld returned 1 exit status
make: *** [game.exe] Error 1
Ниже мой обновленный Makefile
#Makefile
CC = g++
INC_DIR = include
LIB_DIR = lib
SRC_DIR = src
OBJ_DIR = bin
CFLAGS = -Wall -I $(INC_DIR)
LDFLAGS = -L $(LIB_DIR) -static -lglfw3 -lmingw32
OPTIONS = -std=c++0x -O3
SRCS = $(SRC_DIR)/main.cpp
OBJS = $(OBJ_DIR)/main.o
EXECUTABLE = game.exe
all: $(EXECUTABLE)
$(EXECUTABLE) : $(SRCS)
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
clean:
rm $(EXECUTABLE)
Я знаю, что проблема заключается в том, что он находит два основных метода в файле где-то в моей библиотеке mingw32, но я не уверен, как мне следует решить проблему.
Пожалуйста, покажите команду, которая была вызвана, и точную ошибку, которую вы получили, вырезали и вставили. Мне понадобилось бы 1/20 раз, чтобы посмотреть, что случилось, если бы вы это сделали.
Вот ваша проблема:
CFLAGS = -c -Wall -I
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp
$(CC) $(CFLAGS) $< -o $@
В расширенном виде это приведет к следующей команде:
g++ -c -Wall -I src/main.cpp -o bin/main.o
Проблема в том, что у вас есть -I
в вашем CFLAGS
, без него. Это означает, что следующим словом, в данном случае src/main.cpp
, считается каталог, который будет добавлен в строку include.
Возможно, вы хотите что-то вроде:
CFLAGS = -c -Wall -I$(INC_DIR1) -I$(INC_DIR2)
-I
флаг ошибается. Вы использовали-Iinclude/GL
, но ваша строка include в исходном коде включаетGL/glew.h
поэтому, когда компилятор добавляет их вместе, он получаетinclude/GL/GL/glew.h
который не существует. Вам просто нужно добавить-Iinclude
в строку компиляции, чтобы он нашел нужный файлinclude/GL/glew.h