Итак, я пытаюсь использовать Makefile для создания проекта, и я относительно новичок в makefiles в целом. Я получаю несколько ошибок определения при связывании множества функций, и я почти уверен, что это связано с моим make-файлом. Я не могу опубликовать большую часть проекта, так как он довольно большой, но ниже приведен make-файл. Есть ли что-то явно неправильное?
У меня были некоторые функции, объявленные + определенные в заголовке, и перемещение их определений в cpp удалило эти функции из ошибок компоновщика, но я не могу сделать это для всех из них (EDIT: остальные многократно определенные функции не в заголовках они стандартно находятся в файлах cpp/cc, фраза «я не могу сделать это для всех из них» подразумевает, что они все такие, извините), так как большая часть представляет собой кодовую базу, которую я не могу редактировать. В коде не должно быть никаких ошибок, поскольку он отлично строится в отдельном проекте без моих дополнений (ни одно из которых не вызывает ошибок компоновщика), поэтому я полагаю, что это должен быть мой make-файл, но я не могу понять, что я делаю неправильно . Любые идеи?
# Compiler
CXX = g++
# Linker settings
LDFLAGS = -lGL -lGLU -lXext -lX11
# Executable name
EXEC = SplotchPreviewer
# Optimizations for compilation
OPTIMIZE = -std=c++98 -pedantic -Wno-long-long -Wfatal-errors -Wextra -Wall -Wstrict-aliasing=2 -Wundef -Wshadow -Wwrite-strings -Wredundant-decls -Woverloaded-virtual -Wcast-qual -Wcast-align -Wpointer-arith -O2 -g
# Pre-processor settings
CPPFLAGS = $(OPTIMIZE) -I. -Icxxsupport -Ic_utils
# Default Splotch objects
OBJS_SPLOTCH_DEFAULT = cxxsupport/error_handling.o reader/mesh_reader.o cxxsupport/mpi_support.o cxxsupport/paramfile.o \
cxxsupport/string_utils.o cxxsupport/announce.o reader/gadget_reader.o reader/millenium_reader.o \
reader/bin_reader.o reader/tipsy_reader.o splotch/splotchutils.o splotch/scenemaker.o \
cxxsupport/walltimer.o c_utils/walltime_c.o booster/mesh_creator.o booster/randomizer.o \
booster/p_selector.o booster/m_rotation.o cxxsupport/paramfile.o cxxsupport/error_handling.o \
c_utils/walltime_c.o cxxsupport/string_utils.o cxxsupport/announce.o \
cxxsupport/walltimer.o
# Default Previewer objects
OBJS_PREVIEWER_DEFAULT = main.o previewer/Previewer.o previewer/libs/core/Parameter.o previewer/libs/core/ParticleSimulation.o \
previewer/libs/core/WindowManager.o previewer/libs/core/Camera.o previewer/libs/core/ParticleData.o \
previewer/libs/core/MathLib.o previewer/libs/core/FileLib.o previewer/libs/events/OnQuitApplicationEvent.o \
previewer/libs/events/OnKeyReleaseEvent.o previewer/libs/events/OnKeyPressEvent.o previewer/libs/events/OnExposedEvent.o \
previewer/libs/events/OnButtonReleaseEvent.o previewer/libs/events/OnButtonPressEvent.o previewer/libs/core/Texture.o \
previewer/libs/animation/AnimationSimulation.o
#temp force render method
RENDER_METHOD = FFSDL
# Current build specific objects
ifeq ($(RENDER_METHOD),FFSDL)
OBJS_BUILD_SPECIFIC = previewer/libs/renderers/FF_DrawList.o previewer/libs/materials/FF_ParticleMaterial.o
endif
# All objects for this build
OBJS = $(OBJS_SPLOTCH_DEFAULT) $(OBJS_PREVIEWER_DEFAULT) $(OBJS_BUILD_SPECIFIC)
# Rules (note: object files automatically removed when building)
.SUFFIXES: .o .cc .cxx .cpp
.cpp.o:
$(CXX) -c $(CPPFLAGS) -o "$@" "$<"
.cc.o:
$(CXX) -c $(CPPFLAGS) -o "$@" "$<"
.cxx.o:
$(CXX) -c $(CPPFLAGS) -o "$@" "$<"
$(EXEC): $(OBJS)
$(CXX) $(OBJS) $(LDFLAGS) -o $(EXEC)
rm $(OBJS)
clean:
rm -f $(OBJS)
rm -f $(EXEC)
Я вырезал одну или две ненужные вещи, поэтому одна или две части не имеют особого смысла (например, зачем иметь параметр метода рендеринга, когда доступен только один метод). Я немного не уверен, правильно ли я написал правила, и думаю это может объяснить мою проблему? Хотя он выглядит так же, как и другой make-файл, который работает, поэтому я не уверен, в чем проблема. У кого-нибудь есть идеи? Я могу предоставить больше информации, если это необходимо?