Неопределенные символы C при использовании структуры папок

#c #compilation #makefile #undefined-symbol

#c #Сборник #makefile #неопределенный символ

Вопрос:

В настоящее время я пытаюсь понять OpenGL и нашел этот учебник. Я достиг точки, когда я хотел бы сделать что-то из того, что я узнал, поэтому я устал настраивать небольшую папку проекта с (несколько) самодельным файлом Makefile. Структура проекта выглядит следующим образом:

 project_root:
 -- Makefile
 -- src/
       main.cpp
       imageloader.cpp
 -- obj/
       main.o (no compiletime error)
       imageloader.o (no compiletime error)
 -- include/
       imageloader.h
 -- textures/
       some texture files
  

Makefile:

 CC = g  

SRC_DIR = ./src
OBJ_DIR = ./obj
INC_DIR = ./include

INCLUDE_PATHS = -I/usr/local/include -I/opt/X11/include -I$(INC_DIR)
LIBRARY_PATHS = -L/usr/local/lib -I/opt/X11/lib
LINKER_FLAGS = -framework OpenGL -lGLUT
COMPILER_FLAGS = -w

SRC_FILES = main.cpp imageloader.cpp
HEADER_FILES = imageloader.h

HEADERS = $(HEADER_FILES:%.h=$(INC_DIR)/%.h)
SRC = $(SRC_FILES:%.cpp=$(SRC_DIR)/%.cpp)

OBJS = $(SRC_FILES:%.cpp=$(OBJ_DIR)/%.o)

EXEC = main

$(OBJ_DIR)/%.o: $(SRC)
        $(CC) $(INCLUDE_PATHS) $(LIBRARY_PATHS) $(COMPILER_FLAGS) -c -o $@ $<

all: $(OBJS) $(HEADERS)
        $(CC) $(OBJS) $(INCLUDE_PATHS) $(LIBRARY_PATHS) $(COMPILER_FLAGS)         $(LINKER_FLAGS) -o $(EXEC)

run:
    ./main

print:
        @echo "C   objcet files: "$(OBJS)
        @echo "C   source files: "$(SRC)
        @echo "C   header files: "$(HEADERS)

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

Когда я пытаюсь скомпилировать это, я получаю следующий вывод:

 g   -I/usr/local/include -I/opt/X11/include -I./include -L/usr/local/lib -I/opt/X11/lib -w -c -o obj/main.o src/main.cpp
g   -I/usr/local/include -I/opt/X11/include -I./include -L/usr/local/lib -I/opt/X11/lib -w -c -o obj/imageloader.o src/main.cpp
g   ./obj/main.o ./obj/imageloader.o -I/usr/local/include -I/opt/X11/include -I./include -L/usr/local/lib -I/opt/X11/lib -w -framework OpenGL -lGLUT -o main
Undefined symbols for architecture x86_64:
  "loadBMP(char const*)", referenced from:
      initRendering()     in main.o
      initRendering()     in imageloader.o
  "Image::~Image()", referenced from:
      initRendering()     in main.o
      initRendering()     in imageloader.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [all] Error 1
  

Что меня беспокоит, так это то, что код взят только с учебного сайта без каких-либо изменений, и когда я компилирую все это в одну папку (все файлы .cpp и .h в одном месте), он компилируется просто отлично. У меня такое чувство, что я допустил очевидную ошибку, но я не могу понять, что вызывает ошибку?

Может кто-нибудь указать причину, по которой это не компилируется?

Заранее спасибо : )

Комментарии:

1. Он ищет некоторые библиотеки, которые не может найти, я могу только догадываться, что это библиотеки glut. Я не использовал glut в Linux, но в Windows мне пришлось скопировать каталог .dll в system32 и обратиться .lib к моему источнику, я думаю, вам следует сделать то же самое для файлов .so и .a в Linux.

2. О, извините, я должен был упомянуть. Функции, которые, по-видимому, отсутствуют, происходят из imageloader.cpp /h

3. Платформа? Вам действительно нужно включить в вопрос, на какой платформе вы работаете, если вы спрашиваете о проблемах сборки. Для меня это похоже на Mac OS, но предыдущий комментарий предполагает, что это Linux.

4. Это OS X, вы правы, извините. Тем не менее, как указано xio4, проблема возникла из-за imageloader.cpp на самом деле никогда не компилировался.

Ответ №1:

Вы компилируете main.cpp дважды:

 g   -I/usr/local/include -I/opt/X11/include -I./include -L/usr/local/lib -I/opt/X11/lib -w -c -o obj/main.o src/main.cpp <--- main.cpp
g   -I/usr/local/include -I/opt/X11/include -I./include -L/usr/local/lib -I/opt/X11/lib -w -c -o obj/imageloader.o src/main.cpp <--- main.cpp, instead imageloader.cpp
  

Комментарии:

1. Я смотрел на это часами! XD Спасибо!