About every semester I make the same mistake, and I usually waste 30 minutes to an hour to try and figure it out. When I do, I feel like an idiot. So I’m writing this in hopes that I’ll remember next time.
Every semester I’ll have a program to turn in, and I’ll have to compile it on the school UNIX server to turn in. When we get our preference of language, I usually choose C++. I open up Visual Studio and write my program, debug it and get it all working. I try to keep everything very general and remove all Microsoft-specific code. Then I FTP it to the UNIX server and try to compile:
# gcc prog1hw.c
Undefined first referenced
symbol in file
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string[in-charge](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)/var/tmp//ccNHY1WB.o
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)/var/tmp//ccNHY1WB.o
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::append(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)/var/tmp//ccNHY1WB.o
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string[in-charge]()/var/tmp//ccNHY1WB.o
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string [in-charge]()/var/tmp//ccNHY1WB.o
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator+=(char)/var/tmp//ccNHY1WB.o
std::basic_ios<char, std::char_traits<char> >::eof() const/var/tmp//ccNHY1WB.o
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string[in-charge](char const*, std::allocator<char> const&)/var/tmp//ccNHY1WB.o
std::basic_fstream<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)/var/tmp//ccNHY1WB.o
std::basic_fstream<char, std::char_traits<char> >::~basic_fstream [in-charge]()/var/tmp//ccNHY1WB.o
std::basic_fstream<char, std::char_traits<char> >::basic_fstream[in-charge]()/var/tmp//ccNHY1WB.o
std::basic_istream<char, std::char_traints<char> >::ignore(int, int)/var/tmp//ccNHY1WB.o
std::allocator<char>::~allocator [in-charge]()/var/tmp//ccNHY1WB.o
std::allocator<char>::allocator[in-charge]()/var/tmp//ccNHY1WB.o
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::length() const/var/tmp//ccNHY1WB.o
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::at(unsigned)/var/tmp//ccNHY1WB.o
std::cout /var/tmp//ccNHY1WB.o
std::basic_ios<char, std::char_traits<char> >::clear(std::_Ios_Iostate)/var/tmp//ccNHY1WB.o
std::ios_base::Init::~Init [in-charge]()/var/tmp//ccNHY1WB.o
std::ios_base::Init::Init[in-charge]()/var/tmp//ccNHY1WB.o
__gxx_personality_v0 /var/tmp//ccNHY1WB.o
std::basic_istream<char, std::char_traints<char> >::get()/var/tmp//ccNHY1WB.o
std::basic_fstream<char, std::char_traits<char> >::close()/var/tmp//ccNHY1WB.o
std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)/var/tmp//ccNHY1WB.o
std::basic_fstream<char, std::char_traits<char> >::is_open()/var/tmp//ccNHY1WB.o
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::insert(unsigned, char const*)/var/tmp//ccNHY1WB.o
std::cin /var/tmp//ccNHY1WB.o
std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)/var/tmp//ccNHY1WB.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status
What strange stuff is this? It looks like something isn’t being included correctly. Okay…so I go back and start changing stuff. Do I need to add .h on my includes? No, same error. Do I need a newline at the end of the file? No. Maybe I didn’t FTP it correctly…maybe I used binary mode instead of ASCII mode. Nope. Is there something with the compiler? Maybe I need to try a certain switch…after 20 minutes of reading man pages…nope. It’s not finding the string class…have they removed the string class for some reason? What’s going on here?!? And I spend about 30 minutes to an hour trying to figure it out until I realize…
I’m using gcc instead of g++. I’m using a C compiler for a C++ program. Do’h! And I KNOW why I do this, it’s because when I first had any real interaction in a UNIX environment at Cameron University, they set up a symbolic link so gcc was really calling g++. So whenever I want to compile a C++ program in a UNIX environment, I always go for gcc first. ARGH.
Tags: g++, gcc, heartache, problems, programming, unix