[in-charge] [not-in-charge] problems linking C++ files

Discuss the development of software, tools, libraries and anything else that helps make ps2dev happen.

Moderators: cheriff, Herben

Post Reply
User avatar
whatisdot
Posts: 43
Joined: Mon Apr 07, 2008 8:43 am
Location: Purdue University, USA

[in-charge] [not-in-charge] problems linking C++ files

Post by whatisdot »

Hey guys. I'm having a problem with compiling code. I have browsed the threads about compiling, but most of them are two to three years old and don't really supply much help. I have had no problems getting C code to compile and link, but I am having major problems getting C++ code to link. I have messed around with the Makefiles and gotten it to the point where I have hit a brick wall. It appears that the compiler recognizes the classes, but when a call is made to their functions, it doesn't like it and gives me this error.

Code: Select all

ee-gcc -mno-crt0 -T/usr/local/ps2dev/ps2sdk/ee/startup/linkfile -L/usr/local/ps2dev/ps2sdk/ee/lib  \
                -o pclis.elf /usr/local/ps2dev/ps2sdk/ee/startup/crt0.o linked_list.o tokenizer.o shell.o pclis.o -lkbd -ldebug -lstdc++ -lc -lkernel
shell.o(.text+0x10): In function `Shell::Shell[not-in-charge]()':
shell.cc: undefined reference to `Tokenizer::Tokenizer[in-charge]()'
shell.o(.text+0x64):shell.cc: undefined reference to `Tokenizer::~Tokenizer [in-charge]()'
shell.o(.text+0x88): In function `Shell::Shell[in-charge]()':
shell.cc: undefined reference to `Tokenizer::Tokenizer[in-charge]()'
shell.o(.text+0xdc):shell.cc: undefined reference to `Tokenizer::~Tokenizer [in-charge]()'
shell.o(.text+0x10c): In function `Shell::~Shell [not-in-charge]()':
shell.cc: undefined reference to `Tokenizer::~Tokenizer [in-charge]()'
shell.o(.text+0x144): In function `Shell::~Shell [in-charge]()':
shell.cc: undefined reference to `Tokenizer::~Tokenizer [in-charge]()'
collect2: ld returned 1 exit status
make: *** [pclis.elf] Error 1
So what is up with the whole "[in-charge]" "[not-in-charge]" thing??? I did some Google searches, but they all came back saying something like "you probably have a linking error" which I already know. How can I fix this? If you want to see my makefile:

MAKEFILE

Code: Select all

EE_BIN = pclis.elf
EE_OBJS = linked_list.o tokenizer.o shell.o pclis.o
EE_LIBS = -lkbd -ldebug -lstdc++

all: $(EE_BIN)

clean:
	rm -f *.o *.elf *.a

include $(PS2SDK)/samples/Makefile.pref
include $(PS2SDK)/samples/Makefile.eeglobal
Last edited by whatisdot on Sat May 03, 2008 8:07 am, edited 1 time in total.
--------------------------------------------------------------
"A witty saying proves nothing."
--------------------------------------------------------------
ragnarok2040
Posts: 202
Joined: Wed Aug 09, 2006 1:00 am

Post by ragnarok2040 »

You could try using Makefile.eeglobal_cpp which uses the g++ compiler as well as the appropriate CPPFLAGS and libraries as well as compiling and linking rules. The in-charge/not-in-charge messages are from a __in_chrg parameter passed to objects for exception handling so they point to another object instead of being allocated on the heap when they're thrown, I think. At least that's what I gleaned from my google search :D.
User avatar
whatisdot
Posts: 43
Joined: Mon Apr 07, 2008 8:43 am
Location: Purdue University, USA

Post by whatisdot »

Everything appears to compile correctly when I make an ERL... I tried using the different CPP options in the Makefiles, but I can't get the darn thing to make an ELF. From the examples, I can only see C++ being used with ERL files...
Maybe I'm asking the wrong question. Is it even possible to code in C++ and compile an ELF file from it? I haven't seen any simple examples of it.
--------------------------------------------------------------
"A witty saying proves nothing."
--------------------------------------------------------------
User avatar
Lukasz
Posts: 248
Joined: Mon Jan 19, 2004 8:37 pm
Location: Denmark
Contact:

Post by Lukasz »

Simple C++ sample

Makefile

Code: Select all

EE_BIN = main.elf

EE_OBJS = main.o

all: $(EE_BIN)

clean:
	rm -f $(EE_BIN) $(EE_OBJS)

run: all
	ps2client execee host:$(EE_BIN)

reset:
	ps2client reset

include $(PS2SDK)/samples/Makefile.pref
include $(PS2SDK)/samples/Makefile.eeglobal_cpp
main.cpp

Code: Select all

#include <stdio.h>

class Hello
&#123;
	public&#58;
		void Print&#40;&#41;
		&#123;
			printf&#40;"Hello C++"&#41;;
		&#125;
&#125;;

int main&#40;&#41;
&#123;
	Hello hello;

	hello.Print&#40;&#41;;

	return 0;
&#125;
User avatar
whatisdot
Posts: 43
Joined: Mon Apr 07, 2008 8:43 am
Location: Purdue University, USA

Post by whatisdot »

Lukasz,

You're the man!

=) <thumbs up>

What a difference a file extension makes. Change *.cc to *.cpp and suddenly everything works.

C++ will work as long as all the classes are defined in the same file. I'm now trying to figure out how to link multiple files together...
--------------------------------------------------------------
"A witty saying proves nothing."
--------------------------------------------------------------
Post Reply