Welcome! Log In Create A New Profile

Advanced

undefined reference to `WIILIGHT_Init()'

Posted by One2Remember 
undefined reference to `WIILIGHT_Init()'
March 08, 2011 04:05PM
So I've been tweaking the WIIMC source all has gone well up until now, let me start by posting the compiler output


Quote



/c/devkitPro/devkitPPC/bin/powerpc-eabi-ranlib libmplayerwii.a
make[1]: Leaving directory `/c/wiimc/source/mplayer'
menu.cpp
linking ... wiimc.elf
menu.o: In function `ProgressWindow':

c:/wiimc/source/menu.cpp:1221: undefined reference to `WIILIGHT_SetLevel(int)'
c:/wiimc/source/menu.cpp:1222: undefined reference to `WIILIGHT_TurnOff()'
c:/wiimc/source/menu.cpp:1214: undefined reference to `WIILIGHT_Init()'
c:/wiimc/source/menu.cpp:1215: undefined reference to `WIILIGHT_SetLevel(int)'
c:/wiimc/source/menu.cpp:1216: undefined reference to `WIILIGHT_TurnOn()'
c:/wiimc/source/menu.cpp:1300: undefined reference to `WIILIGHT_SetLevel(int)'
collect2: ld returned 1 exit status
make[1]: *** [/c/wiimc/wiimc.elf] Error 1
"make": *** [build] Error 2

> Process Exit Code: 2
> Time Taken: 01:33


Here are the offending lines of code

Quote


if(showProgress == 1)
{
promptWindow.Append(&progressEmptyImg);
promptWindow.Append(&progressLeftImg);
promptWindow.Append(&progressMidImg);
promptWindow.Append(&progressLineImg);
promptWindow.Append(&progressRightImg);
WIILIGHT_Init();
WIILIGHT_SetLevel(1);
WIILIGHT_TurnOn();

}
else
{
promptWindow.Append(&throbberImg);
WIILIGHT_SetLevel(0);
WIILIGHT_TurnOff();

}


As you can see all is well until linking, let me go over what I do know, i've implemented the wii light code in other sources the same exact way such as the wii hello world example so I know the code is right , I suspect that my problem is the make file.

Here is the make file


Quote


#---------------------------------------------------------------------------------
# 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
#---------------------------------------------------------------------------------

MPLAYER := $(CURDIR)/source/mplayer
TARGET := wiimc
BUILD := build
SOURCES := source source/libwiigui source/utils source/utils/unzip \
source/images source/lang source/fonts


INCLUDES := source source/mplayer


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


CFLAGS = -g -O3 -Wall $(MACHDEP) $(INCLUDE) \
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
CXXFLAGS = $(CFLAGS)
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map -specs=wiimc.spec

#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------

LIBS := -lmplayerwii -lavformat -lavcodec -lavutil -lpostproc -lswscale \
-lfribidi -ljpeg -ldi -liso9660 -liconv -lpcrecpp -lpcre \
-lpng -lz -lntfs -lext2fs -lfat -lwiiuse -lbte -logc -lwiilight -lfreetype \
-lmxml -ltinysmb -lexif

#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
# include and lib
#---------------------------------------------------------------------------------

LIBDIRS := $(PORTLIBS)




#---------------------------------------------------------------------------------
# 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)/$(TARGETDIR)/$(TARGET)
export VPATH := $(foreach dir,$(SOURCES),$(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)))
TTFFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.ttf)))
LANGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.lang)))
PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png)))
JPGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.jpg)))

#---------------------------------------------------------------------------------
# use CXX for linking C++ projects, CC for standard C
#---------------------------------------------------------------------------------

ifeq ($(strip $(CPPFILES)),)
export LD := $(CC)
else
export LD := $(CXX)
endif

export OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \
$(sFILES:.s=.o) $(SFILES:.S=.o) \
$(TTFFILES:.ttf=.ttf.o) $(LANGFILES:.lang=.lang.o) \
$(PNGFILES:.png=.png.o) $(JPGFILES:.jpg=.jpg.o)
#---------------------------------------------------------------------------------
# build a list of include paths
#---------------------------------------------------------------------------------

export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
-I$(CURDIR)/$(BUILD) \
-I$(LIBOGC_INC) -I$(PORTLIBS)/include/freetype2 \


#---------------------------------------------------------------------------------
# build a list of library paths
#---------------------------------------------------------------------------------


export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \
-L$(LIBOGC_LIB) \
-L$(MPLAYER)/ \
-L$(MPLAYER)/ffmpeg/libavcore \
-L$(MPLAYER)/ffmpeg/libavcodec \
-L$(MPLAYER)/ffmpeg/libavformat \
-L$(MPLAYER)/ffmpeg/libavutil \
-L$(MPLAYER)/ffmpeg/libpostproc \
-L$(MPLAYER)/ffmpeg/libswscale

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

#---------------------------------------------------------------------------------
$(BUILD):
cd source/mplayer; $(MAKE) -f Makefile; cd ../..
@[ -d $@ ] || mkdir -p $@
@make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile

#---------------------------------------------------------------------------------
test:
@make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile


clean:
@echo clean ...
rm -f $(BUILD)/*.d $(BUILD)/*.h $(BUILD)/*.ii $(BUILD)/*.lst $(BUILD)/*.map \
$(BUILD)/*.o $(BUILD)/*.s
@rm -fr $(OUTPUT).elf $(OUTPUT).dol
cd source/mplayer; $(MAKE) -f Makefile clean

#---------------------------------------------------------------------------------
run:
wiiload $(OUTPUT).dol

#---------------------------------------------------------------------------------
reload:
wiiload -r $(OUTPUT).dol

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

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

#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------

$(OUTPUT).dol: $(OUTPUT).elf
$(OUTPUT).elf: $(OFILES)

#---------------------------------------------------------------------------------
# This rule links in binary data with .ttf, .lang, .png, and .jpg extensions
#---------------------------------------------------------------------------------

%.ttf.o : %.ttf
@echo $(notdir $<)
$(bin2o)

%.lang.o : %.lang
@echo $(notdir $<)
$(bin2o)

%.png.o : %.png
@echo $(notdir $<)
$(bin2o)

%.jpg.o : %.jpg
@echo $(notdir $<)
$(bin2o)

-include $(DEPENDS)

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





As you can see I have linked the wiilight library, I mention this because the compiler acts as if it doesn't see the library at all hints: undefined reference to `WIILIGHT_TurnOff()' / `WIILIGHT_TurnOn()' / `WIILIGHT_SetLevel()' ect ect.....


Quote

#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------

LIBS := -lmplayerwii -lavformat -lavcodec -lavutil -lpostproc -lswscale \
-lfribidi -ljpeg -ldi -liso9660 -liconv -lpcrecpp -lpcre \
-lpng -lz -lntfs -lext2fs -lfat -lwiiuse -lbte -logc -lwiilight -lfreetype \
-lmxml -ltinysmb -lexif









Here is the make file of a different project "the hello world project" in which I was able to implement the wii light codes and they worked flawlessly, maybe this will help with figuring out my problem by comparing the two make files..



Quote


#---------------------------------------------------------------------------------
# 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 file
#---------------------------------------------------------------------------------

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) -Wl,-Map,$(notdir $@).map

#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------

LIBS := ]-lwiiuse] -lbte -logc -lm -lwiilight

#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
# include and lib
#---------------------------------------------------------------------------------

LIBDIRS :=

#---------------------------------------------------------------------------------
# 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:
wiiload $(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)

-include $(DEPENDS)

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



9 hours in and I cant figure this out for the life of me! I've tried a million different solutions, hours and hours of google searching to no avail, the messed up thing is that I know it's a simple fix, I'm sure one of you guys will point out the problem with ease... " bangs head on desk"



Edited 7 time(s). Last edit at 03/08/2011 05:31PM by One2Remember.
Re: undefined reference to `WIILIGHT_Init()'
March 09, 2011 07:17AM
is your hello world program a c or cpp file? if it is a c file, try changing it to cpp and see if it still builds ok. if changing it to cpp makes it not link ok, maybe you can try adding to the the header file for libwiilight
#ifdef __cplusplus
extern "C"
{
#endif

blablabla....


#ifdef __cplusplus
}
#endif
Re: undefined reference to `WIILIGHT_Init()'
March 09, 2011 07:53AM
I'm going to try this, I'll let you know how it turns out, ty for your efforts.


Edit: No luck, it was worth a try I thought for sure that was it... On a lighter note I can recreate the problem in the hello world app by removing
-lwiilight from the make file, this would suggest to me the problem is the make file. I've heard that the libs should be in a certain order.. is this true? if so thats my problem, below is the order of wiimc project libs, is -lwiilight in the wrong position? I guess I should try each position...
Quote


#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------

LIBS := -lmplayerwii -lavformat -lavcodec -lavutil -lpostproc -lswscale \
-lfribidi -ljpeg -lwiilight -ldi -liso9660 -liconv -lpcrecpp -lpcre \
-lpng -lz -lntfs -lext2fs -lfat -lwiiuse -lbte -logc -lfreetype \
-lmxml -ltinysmb -lexif



Edited 2 time(s). Last edit at 03/09/2011 11:22AM by One2Remember.
Re: undefined reference to `WIILIGHT_Init()'
March 10, 2011 02:10AM
giantpune, thanks for the suggestion it did put me on the right path and the solution was very much like the one you suggested. I had to open up wiilight.h and copy the functions and move them into the file I was calling them in like so..

Quote



extern "C" {

void WIILIGHT_Init();
void WIILIGHT_TurnOn();
int WIILIGHT_GetLevel();
int WIILIGHT_SetLevel(int level);

void WIILIGHT_Toggle();
void WIILIGHT_TurnOff();

}






Then I had to remove the wiilight.h from includes at the top and the 2 day wiilight nightmare comes to a close lol.

Quote

#include < wiilight.h>






I thought I would post this solution here and give back to the community, I saw many people having this issue few if any of which ever solved it, enjoy and happy coding. Thanks again giantpune.



Quote

SOLVED



Edited 3 time(s). Last edit at 03/10/2011 02:16AM by One2Remember.
Re: undefined reference to `WIILIGHT_Init()'
March 10, 2011 09:07AM
Your sollution is wrong. You shouldn't copy the contents of the header file. It works, but doesn't make it right.
extern "C" {
#include < wiilight.h>
}
Re: undefined reference to `WIILIGHT_Init()'
March 10, 2011 05:27PM
Yeah that makes more sens.. thanks.
Re: undefined reference to `WIILIGHT_Init()'
March 12, 2011 03:31AM
giantpune's answer was better.
Sorry, only registered users may post in this forum.

Click here to login