Welcome! Log In Create A New Profile

Advanced

Undefined references

Posted by Oscar_Richard 
Undefined references
November 03, 2010 07:21PM
I got some trouble with a project I'm trying to do for the Wii. When compiling it shows me this:

> "make" 
main.cpp
linking ... yosdemo.elf
main.o: In function `levelManager::update()':
e:/yosdemo/source/lvl/level_manager.cpp:17: undefined reference to `mapLevel::draw()'
main.o: In function `__static_initialization_and_destruction_0':
e:/yosdemo/source/lvl/level_manager.cpp:4: undefined reference to `mapLevel::~mapLevel()'
e:/yosdemo/source/lvl/level_manager.cpp:4: undefined reference to `mapLevel::mapLevel()'
collect2: ld returned 1 exit status
make[1]: *** [/e/yosdemo/yosdemo.elf] Error 1
"make": *** [build] Error 2

> Process Exit Code: 2
> Time Taken: 00:11


Here are the files:

level_manager.cpp:
#include "level_manager.h"
#include "level.h"

mapLevel Level;

levelManager::levelManager()
{
	
}
levelManager::~levelManager()
{

}

void levelManager::update()
{
	Level.draw();
};

level_manager.h:
#ifndef __LEVEL_MANAGER_H__
#define __LEVEL_MANAGER_H__

class levelManager
{
	public:
		levelManager();
		~levelManager();
		void update();
		//bool draw();
};

#endif

level.cpp:
#include "../redblock.h"
#include "../camera.h"
#include "level.h"
#include "map.h"

#define tilew (16)
#define tileh (16)

GRRLIB_texImg * block;

mapLevel::mapLevel()
{
	block = GRRLIB_LoadTexture(spr_redblock);
	mapw=32;
	maph=15;
}


mapLevel::~mapLevel()
{
}

void mapLevel::start()
{
	block = GRRLIB_LoadTexture(spr_redblock);
	mapw=32;
	maph=15;
}

bool mapLevel::draw()
{
	for (x=0; x<=mapw; x++) {
		for (y=0; y<=maph; y++) {
			if (testlevel_map0[y][x]!=0) {
				GRRLIB_DrawImg(x*tilew+camx, y*tileh, block, 0, 1, 1, 0xFFFFFFFF);
			}
		}
	}
return true;
};

level.h:
#ifndef __LEVEL_H__
#define __LEVEL_H__

class mapLevel
	{
		public:
			mapLevel();
            ~mapLevel();
			void start();
			bool draw();
			int x, y;
			int tilew, tileh;
			int mapw, maph;
	};
#endif

Makefile:
#---------------------------------------------------------------------------------
# Clear the implicit built in rules
#---------------------------------------------------------------------------------
.SUFFIXES:
#---------------------------------------------------------------------------------
ifeq ($(strip $(DEVKITPPC)),)
$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC)
endif

include $(DEVKITPPC)/wii_rules

#---------------------------------------------------------------------------------
# TARGET is the name of the output
# BUILD is the directory where object files & intermediate files will be placed
# SOURCES is a list of directories containing source code
# INCLUDES is a list of directories containing extra header files
#---------------------------------------------------------------------------------
TARGET		:=	$(notdir $(CURDIR))
BUILD		:=	build
SOURCES		:=	source
DATA		:=	data  
INCLUDES	:=

#---------------------------------------------------------------------------------
# options for code generation
#---------------------------------------------------------------------------------

CFLAGS	= -g -O2 -Wall $(MACHDEP) $(INCLUDE)
CXXFLAGS = $(CFLAGS)

LDFLAGS	=	-g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map

#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
 LIBS    := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat 
 LIBS    += -lwiiuse 
 LIBS    += -lmodplay -lasnd 
 LIBS    += -lbte -logc -lm 

#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
# include and lib
#---------------------------------------------------------------------------------
LIBDIRS	:=		$(CURDIR)

#---------------------------------------------------------------------------------
# no real need to edit anything past this point unless you need to add additional
# rules for different file extensions
#---------------------------------------------------------------------------------
ifneq ($(BUILD),$(notdir $(CURDIR)))
#---------------------------------------------------------------------------------

export OUTPUT	:=	$(CURDIR)/$(TARGET)

export VPATH	:=	$(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
					$(foreach dir,$(DATA),$(CURDIR)/$(dir))

export DEPSDIR	:=	$(CURDIR)/$(BUILD)

#---------------------------------------------------------------------------------
# automatically build a list of object files for our project
#---------------------------------------------------------------------------------
CFILES		:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
CPPFILES	:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
sFILES		:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
SFILES		:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S)))
BINFILES	:=	$(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))

#---------------------------------------------------------------------------------
# use CXX for linking C++ projects, CC for standard C
#---------------------------------------------------------------------------------
ifeq ($(strip $(CPPFILES)),)
	export LD	:=	$(CC)
else
	export LD	:=	$(CXX)
endif

export OFILES	:=	$(addsuffix .o,$(BINFILES)) \
					$(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \
					$(sFILES:.s=.o) $(SFILES:.S=.o)

#---------------------------------------------------------------------------------
# build a list of include paths
#---------------------------------------------------------------------------------
export INCLUDE	:=	$(foreach dir,$(INCLUDES), -iquote $(CURDIR)/$(dir)) \
					$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
					-I$(CURDIR)/$(BUILD) \
					-I$(LIBOGC_INC)

#---------------------------------------------------------------------------------
# build a list of library paths
#---------------------------------------------------------------------------------
export LIBPATHS	:=	$(foreach dir,$(LIBDIRS),-L$(dir)/lib) \
					-L$(LIBOGC_LIB)

export OUTPUT	:=	$(CURDIR)/$(TARGET)
.PHONY: $(BUILD) clean

#---------------------------------------------------------------------------------
$(BUILD):
	@[ -d $@ ] || mkdir -p $@
	@make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile

#---------------------------------------------------------------------------------
clean:
	@echo clean ...
	@rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol

#---------------------------------------------------------------------------------
run:
	psoload $(TARGET).dol

#---------------------------------------------------------------------------------
reload:
	psoload -r $(TARGET).dol


#---------------------------------------------------------------------------------
else

DEPENDS	:=	$(OFILES:.o=.d)

#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
$(OUTPUT).dol: $(OUTPUT).elf
$(OUTPUT).elf: $(OFILES)

#---------------------------------------------------------------------------------
# This rule links in binary data with the .jpg extension
#---------------------------------------------------------------------------------
%.jpg.o	:	%.jpg
#---------------------------------------------------------------------------------
	@echo $(notdir $<)
	$(bin2o)
	
#--------------------------------------------------------------------------------- 
 %.png.o :       %.png 
#---------------------------------------------------------------------------------
	@echo $(notdir $<) 
	$(bin2o) 

%.bin.o	:	%.bin
#---------------------------------------------------------------------------------
	@echo $(notdir $<)
	$(bin2o)

-include $(DEPENDS)

#---------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------

I really don't know why it is not taking the mapLevel's.
I use Programmers Notepad, of course. I dont know if it is something to do with the Makefile I have.
If there's a missing file I have to put, let me know.
Re: Undefined references
November 03, 2010 10:41PM
It could be a mix up with your classes, try technik's solution, make clean will remove any object file.



Edited 1 time(s). Last edit at 11/04/2010 04:55PM by LaserFlash.
Re: Undefined references
November 03, 2010 11:56PM
Sometimes all you have to do is make clean, then make again
Re: Undefined references
November 04, 2010 10:07AM
Quote
LaserFlash
Try updating to the latest libogc and see if that works.
Don't reply if you don't understand the error at all. This has nothing to do with libogc.

technik's sollution might work. It looks like level.cpp isn't rebuild after you changed it. If it doesn't work after a "make clean", then show us the output from "make" after you did a clean, that might help us find your problem.
Re: Undefined references
November 04, 2010 04:16PM
You dont have anything named "Level" in your "levelManager" class definition.

Edit: Just realized "Level" is in the levelManager.cpp file. Still though, thats bad practice to use it like that. I cant even imagine all the scoping problems that's going to give you. Move it into your levelManager class.



Edited 1 time(s). Last edit at 11/04/2010 04:18PM by Arikado.
Re: Undefined references
November 04, 2010 04:30PM
Quote
Arikado
Edit: Just realized "Level" is in the levelManager.cpp file. Still though, thats bad practice to use it like that. I cant even imagine all the scoping problems that's going to give you. Move it into your levelManager class.
I think you wanted to say "global variable BAD", move that one to the LevelManager class?
Re: Undefined references
November 04, 2010 10:53PM
The output errors are the same even I do make clean.

The reason I got level and level manager separated is because of level traveling, so I was trying to make level manager to tell level which stage will display first, which one will be next, etc.
So this is not necessary, and I can make them in one, right?

Edit: I'll do it later.



Edited 1 time(s). Last edit at 11/04/2010 10:53PM by Oscar_Richard.
Re: Undefined references
November 04, 2010 11:25PM
Is the level.cpp in a subdirectory or something?

> "make" 
main.cpp
linking ... yosdemo.elf
Only shows that it compiles main.cpp, and not any other cpp file, while you say you have more files.

If this is the case then update the SOURCES in the Makefile:
SOURCES		:=	source source/subdircontaininglevelcpp



Edited 1 time(s). Last edit at 11/04/2010 11:25PM by Daid.
Re: Undefined references
November 05, 2010 01:16AM
Agree with Daid.
If you have make: clean, then the filenames should have been listed before the linking of the *.elf.
It does seem that the files are not being seen / noticed in the compilation stages. Maybe put them in the same folder as the main.cpp file or add the directory into your makefile in which the files are being stored.
Re: Undefined references
November 05, 2010 03:18PM
Daid:
Thats not necessarily the case. I believe what he did was make his project, change main.cpp, and then make his project again causing only main.cpp to be compiled again because it was changed. I can back my theory up by pointing out that his other files have errors in the linking stage thus they must have passed the compiling stage previous to him posting the log here. Still though, I agree, I'd like to see the output from a make clean anyway.
Re: Undefined references
November 05, 2010 03:54PM
Quote
Arikado
Daid:
Thats not necessarily the case. I believe what he did was make his project, change main.cpp, and then make his project again causing only main.cpp to be compiled again because it was changed. I can back my theory up by pointing out that his other files have errors in the linking stage thus they must have passed the compiling stage previous to him posting the log here. Still though, I agree, I'd like to see the output from a make clean anyway.
But wouldn't that still cause the level.cpp be included in the link, and thus resolving these undefined references? As the level.cpp is fine on its own.
Multiple paths with cpp files in them seem to make the most sense to me, with the #include <../...>

(I don't have a love for Makefiles, I found them to be counterproductive. When they work they work "ok", but when they fail you have a steaming pile of shit. I am much bigger fan of CodeBlocks, which takes a bit of work to setup, but after that you can just throw in more files and it keeps working. And it handles header dependencies/changes with ease)
Re: Undefined references
November 05, 2010 09:29PM
I modified the Makefile, just like Daid said, and it compiled the cpp levels and now my program ran fine. So I think all I had to do was to change the Makefile.

P.S. The Output of the make clean was this:

> "make" clean
clean ...

> Process Exit Code: 0
> Time Taken: 00:11
Sorry, only registered users may post in this forum.

Click here to login