Я пишу код для длинного проекта, который использует как минимум 15 заголовков. Я любитель встроенных определений внутри заголовков, но для такого длинного проекта я столкнулся с некоторыми проблемами при использовании этого метода, поэтому я решил написать файл заголовка .h с файлом. cpp для определений. Так как я новичок в этом методе, я не уверен, как написать make-файл. Я попытал счастья, но он продолжает давать мне известную ошибку «Неопределенные символы для архитектуры x86_64». Я думаю, что внутри make-файла мне нужно просто скомпилировать с использованием объектных файлов все те заголовки, которые используют файл partner. cpp, и ничего для встроенных определений (.h). Правильно ли это мышление? Является ли следующий make-файл нормальным или неправильным?
Makefile
CC = gcc
G = g++
SDLFLAGS = -lSDL_image -lSDL_ttf -lSDL2
INCS= `sdl2-config --cflags --libs`
AssetManager.o: AssetManager.cpp
${CC} -std=c++17 -c AssetManager.cpp
Collision.o: Collision.cpp
${CC} -std=c++17 -c Collision.cpp
Game.o: Game.cpp
${CC} -std=c++17 -c Game.cpp
Map.o: Map.cpp
${CC} -std=c++17 -c Map.cpp
TextureManager.o: TextureManager.cpp
${CC} -std=c++17 -c TextureManager.cpp
ECS.o: ECS/ECS.cpp
${CC} -std=c++17 -c ECS/ECS.cpp
main: main.cpp *.o ECS/Animation.h ECS/ColliderComponent.h ECS/Components.h ECS/KeyboardController.h ECS/ProjectileComponent.h ECS/SpriteComponent.h ECS/TileComponent.h ECS/TransformComponent.h ECS/UILabel.h colors.h
${G} -std=c++17 main.cpp -o main *.o ${INCS} ${SDLFLAGS}
clean:
rm *.o
cleanmain:
rm main
edit:
vim main.cpp
Как я и предполагал ранее, все команды, использующие .o, предназначены для заголовков, которые поставляются с файлом. cpp, все встроенные заголовки .h включены в строку main: main.cpp *.o ECS/Animation.h ECS/ColliderComponent.h etc..
Пример ошибки, которую он мне дает, следующий:
Undefined symbols for architecture x86_64:
"Vector2D::Zero()", referenced from:
TransformComponent::init() in AssetManager.o
TransformComponent::TransformComponent() in AssetManager.o
TransformComponent::init() in Game.o
TransformComponent::TransformComponent() in Game.o
TransformComponent::TransformComponent() in Map.o
TransformComponent::init() in Map.o
"Vector2D::Vector2D(float, float)", referenced from:
Game::init(char const*, int, int, bool) in Game.o
"Vector2D::Vector2D()", referenced from:
TransformComponent::TransformComponent(float, float, int, int, int) in AssetManager.o
TransformComponent::TransformComponent() in AssetManager.o
TransformComponent::TransformComponent(float, float, int, int, int) in Game.o
TransformComponent::TransformComponent() in Game.o
TransformComponent::TransformComponent() in Map.o
TileComponent::TileComponent(int, int, int, int, int, int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in Map.o
"operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Vector2D const&)", referenced from:
Game::update() in Game.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
, где TransformComponent на самом деле просто .h заголовок ... Куда я иду не так?