AR15.Com Archives
 Decided to just fix the code...stuck. Real C++ coders, please stop on by! (WAS: GCC/G++ 4.1.2)
JSteensen  [Team Member]
5/7/2012 11:12:46 AM
And not having any luck. I download the texinfo package, configure, fix the makeinfo line on the Makefile, and make. Make runs for about 20-30 minutes before it errors out. I spent most the weekend trying to get 4.1.2 installed. (My software will only compile under 4.1.2...and there is far too much code and I am far too unskilled a C++ coder to fix it and make it compatable with the latest GCC.)

After tearing my hair out all weekend, I am about ready to throw in the towel...but I really want to get this working now. It's gotten personal.

Is there any linux distros out there that use GCC/G++ 4.1.2 natively? (Even if I have to download a seriously old distro?)

EDIT: Decided to just fix the source code to let it compile using the latest GCC. I am now stuck as a non-C++ coding fool. See below!
Gosu  [Team Member]
5/7/2012 10:37:02 PM
What was the make error?
learath  [Member]
5/7/2012 10:42:13 PM
Originally Posted By Gosu:
What was the make error?


id-ten-t
He tried to write over the system installed glibc for reasons he was never clear on. He needs to install the build package, not compile gcc.
JSteensen  [Team Member]
5/7/2012 10:46:39 PM
If it would let me install the build package I would. No need to be a dick. I get the same error message about no install candidates for the package, even after all dependencies are installed. Thanks for your valuable input though learath. Sorry for trying to teach myself something outside my normal profession.
learath  [Member]
5/7/2012 10:50:48 PM
Originally Posted By JSteensen:
If it would let me install the build package I would. No need to be a dick. I get the same error message about no install candidates for the package, even after all dependencies are installed. Thanks for your valuable input though learath. Sorry for trying to teach myself something outside my normal profession.

Last time I replied it was 5 minutes after installing a fresh VM with the current debian image, and installing the build tools. There were no issues, other than having to use the current version number. In debian you can find the available versions with apt-cache search packagename.
JSteensen  [Team Member]
5/8/2012 10:16:33 AM
Well, I've decided to take your advice and just recode...it actually wasn't that much - it was the same error in 6 files, that made fine. I corrected them. I do have one that I can't figure out. First Code block contains the error, and the rest contains the file contents. I'm really lost at this point. The ID-10-T may apply now:

Error:
g++  -DDEBUG -Dlinux -Wno-deprecated -I /usr/local/include/ -ggdb  -c -o vtable.o vtable.cpp
vtable.cpp: In static member function ‘static void VTable::separate(const char*, char*, char*)’:
vtable.cpp:322: error: invalid conversion from ‘const char*’ to ‘char*’
make: *** [vtable.o] Error 1

vtable.h
// file: vtable.h
// author: Andrew Hynek
// contents: a value table (VTable) class

#ifndef __vtable_h__
#define __vtable_h__

class File;

class VTable
{
  static const int MAX_SECTION_LENGTH = 32;
  static const int MAX_FIELD_LENGTH = 32;
  static const int MAX_LINE_LENGTH = 256;

  struct field
  {
    char name[MAX_FIELD_LENGTH];
    char line[MAX_LINE_LENGTH];
    char *multiline;

    field() : multiline(NULL)
    {
      *name = '\0';
      *line = '\0';
    }

    ~field();

    field &operator=(const field &two)
    {
      // do a deep copy
      strcpy(name, two.name);
      strcpy(line, two.line);

      if (two.multiline) {
        if (!multiline) {
          multiline = new char[strlen(two.multiline)+1];
          strcpy(multiline, two.multiline);
        } else if (strcmp(multiline, two.multiline)) {
          delete [] multiline;
          multiline = new char[strlen(two.multiline)+1];
          strcpy(multiline, two.multiline);
        }
      } else if (multiline) {
        delete [] multiline;
        multiline = NULL;
      }

      return (*this);
    }
  };

  struct section
  {
    char name[MAX_SECTION_LENGTH]; // NULL for top
    section *parent;

    section *sub_tab;
    int sub_cnt;
    int sub_size;

    field *field_tab;
    int field_cnt;
    int field_size;

    section() : parent(NULL),
        sub_tab(NULL), sub_cnt(0), sub_size(0),
        field_tab(NULL), field_cnt(0), field_size(0)
    {
      *name = '\0';
    }

    ~section();

    section &operator=(const section &two)
    {
      strcpy(name, two.name);

      parent = two.parent;

      if (two.sub_tab && two.sub_cnt > 0) {
        sub_size = two.sub_size;
        sub_cnt = two.sub_cnt;

        if (sub_tab)
          delete [] sub_tab;

        sub_tab = new section[sub_size];

        for (int i = 0; i < sub_cnt; i++)
          sub_tab[i] = two.sub_tab[i];
      } else {
        sub_cnt = 0;
        sub_size = 0;

        if (sub_tab) {
          delete [] sub_tab;
          sub_tab = NULL;
        }
      }

      if (two.field_tab && two.field_cnt > 0) {
        field_size = two.field_size;
        field_cnt = two.field_cnt;

        if (field_tab)
          delete [] field_tab;

        field_tab = new field[field_size];

        for (int i = 0; i < field_cnt; i++)
          field_tab[i] = two.field_tab[i];
      } else {
        field_cnt = 0;
        field_size = 0;

        if (field_tab) {
          delete [] field_tab;
          field_tab = NULL;
        }
      }

      return (*this);
    }
  };

  section top;

public:
  int  NumSections() const;
  int  NumSubsections(const char *sect);
  int  NumFields(const char *sect_name);

  bool DoesSectionExist(const char *sect);
  bool DoesFieldExist(const char *where);

  // returns the number of fields successfully parsed
  int Parse(File *in);

  int GetInt(const char *where, int defawlt);
  long GetLong(const char *where, long defawlt);

  // assumes lookup_tab is "\n"-terminated, returns index of string in tab
  int LookupInt(const char *where, const char **lookup_tab, int defawlt);

  const char *GetString(const char *where, const char *defawlt);

  float GetFloat(const char *where, float defawlt);

  // returns a pointer (don't delete) to field name of nth field in section
  const char *GetIndexField(const char *sect_name, int n);

  // like GetIndexField, but for subsection names
  const char *GetIndexSection(const char *sect_name, int n);

  // returns the int of the nth field in section
  int GetIndexInt(const char *sect_name, int n, int defawlt);

  const char *GetIndexString(const char *sect_name, int n,
                             const char *defawlt);
  // float GetIndexFloat();

  // bool AddInt(const char *where, int n);
  // bool AddString(const char *where, const char *str);
  // bool AddFloat(const char *where, float f);

private:
  static void separate(const char *where,
                       char section[MAX_SECTION_LENGTH],
                       char field[MAX_FIELD_LENGTH]);

  void resize_subsection_tab(section *ptr, int empty = 5);
  void resize_field_tab(section *ptr, int empty = 5);

  field *find_field(const char *where);
  section *find_section(const char *sect);
  section *look_for_section(section *ptr, const char *name);

  int count_subsections(const section *ptr) const;
};

#endif // ifndef __vtable_h__

vtable.cpp

// file: vtable.cpp
// author: Andrew Hynek
// contents: implementation of the VTable class

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "file.h"
#include "vtable.h"
#include "utils.h"    // for str_cmp(), log()

VTable::field::~field()
{
  if (multiline) {
    delete [] multiline;
    multiline = NULL;
  }
}

VTable::section::~section()
{
  *name = '\0';
  parent = NULL;

  if (sub_tab) {
    delete [] sub_tab;
    sub_tab = NULL;
  }
  sub_cnt = 0;
  sub_size = 0;

  if (field_tab) {
    delete [] field_tab;
    field_tab = NULL;
  }
  field_cnt = 0;
  field_size = 0;
}

int  VTable::NumSections() const
{
  return (count_subsections(&top)+1);
}

int  VTable::NumSubsections(const char *sect)
{
  section *ptr = find_section(sect);

  if (!ptr)
    return -1;

  return ptr->sub_cnt;
}

int  VTable::NumFields(const char *sect)
{
  section *ptr = find_section(sect);

  if (!ptr)
    return -1;

  return ptr->field_cnt;
}

bool VTable::DoesSectionExist(const char *sect)
{
  return (find_section(sect) != NULL);
}

bool VTable::DoesFieldExist(const char *where)
{
  return (find_field(where) != NULL);
}

#define SKIP { in->GetLine(line, MAX_LINE_LENGTH*2, FALSE); continue; }

int  VTable::Parse(File *in)
{
  char line[MAX_LINE_LENGTH*2];
  int depth = 0, total_fields = 0;
  section *sec_ptr = &top;

  in->GetLine(line, MAX_LINE_LENGTH*2, FALSE);
  while (!in->EoF() && str_cmp(line, "BREAK")) {
    char *line_ptr = line;
    int d;
    bool multiline_input = false;

    // skip spaces
    while (*line_ptr && *line_ptr == ' ')
      line_ptr++;

    // calculate depth (1 per leading tab)
    d = 0;
    while (*line_ptr == '\t') {
      line_ptr++;
      d++;
    }

    //    printf("depth=%d, d=%d, line_ptr=%s\n", depth, d, line_ptr);

    if (d > depth) {
      log("Warning: depth doesn't match field depth (%d != %d) (%s, line %d)",
          d, depth, in->Filename(), in->LineNumber());
      SKIP;
    } else
      while (d < depth) {
        // while the current depth < sec_ptr_depth, pull out a level
        sec_ptr = sec_ptr->parent;
        depth––;
      }

    { // check for section title
      char *open = strchr(line_ptr, '[');
      char *close = strchr(line_ptr, ']');

      // if it's there at at the beginning of the line,
      // descend into another level
      if (open && close && close > open && open == line_ptr) {
        // check to see if we need a new table
        if (!sec_ptr->sub_tab || sec_ptr->sub_cnt >= sec_ptr->sub_size)
          resize_subsection_tab(sec_ptr);

        section *new_sec = sec_ptr->sub_tab+sec_ptr->sub_cnt;
        sec_ptr->sub_cnt++;

        // set the data:
        new_sec->parent = sec_ptr;

        char *src = open+1, *dst = new_sec->name;
        while (*src != ']') { // we know ']' is there, for sure
          *(dst++) = *(src++);
        }
        *dst = '\0';

        // set depth and sec_ptr, then skip
        sec_ptr = new_sec;
        depth++;

        //printf("read section title %s, inc'ing depth\n", sec_ptr->name);

        SKIP;
      }
    }

    // so we know by this point that we have a potential field,
    // so first check to see if we need a new table
    if (!sec_ptr->field_tab || sec_ptr->field_cnt >= sec_ptr->field_size)
      resize_field_tab(sec_ptr);

    // then get the next field entry
    field *field_ptr = sec_ptr->field_tab+sec_ptr->field_cnt;
    char *name_ptr = field_ptr->name;

    // copy the field name, until ":\t" or ":$"
    while (*line_ptr) {
      if (*line_ptr == ':' &&
          (*(line_ptr+1) == '\t' || *(line_ptr+1) == '$'))
        break;

      if((name_ptr-field_ptr->name) > MAX_FIELD_LENGTH)
        field_ptr->name[MAX_FIELD_LENGTH - 1] = '\0';

      *(name_ptr++) = *(line_ptr++);
    }
    *name_ptr = '\0';

    // make sure we've got a field name
    if (!*line_ptr) {
      log("Invalid field: '%s' (%s, line %d)",
          line, in->Filename(), in->LineNumber());
      SKIP;
    }

    //printf("continuing with field %s\n", field_ptr->name);

    // and if we do, advance the field_cnt and continue
    sec_ptr->field_cnt++;
    total_fields++;

    // advance line_ptr past the ":\t" or ":$", and skip the spaces
    if (*line_ptr == ':') {
      if (*(line_ptr+1) == '$') {
        multiline_input = true;
        line_ptr += 2;
      } else if (*(line_ptr+1) == '\t')
        line_ptr += 2;

      while (*line_ptr && (*line_ptr == ' ' || *line_ptr == '\t'))
        line_ptr++;
    }

    // now if we have a single line, just copy the rest of the line
    if (!multiline_input) {
      memset(field_ptr->line, 0, MAX_LINE_LENGTH);
      strncpy(field_ptr->line, line_ptr, MAX_LINE_LENGTH);
    } else {
      // otherwise use ReadString to get a '~'-terminated multiline string
      field_ptr->multiline = in->ReadString();
    }

    in->GetLine(line, MAX_LINE_LENGTH*2, FALSE);
  }

  return total_fields;
}

#undef SKIP

int  VTable::GetInt(const char *where, int defawlt)
{
  field *ptr = find_field(where);

  if (!ptr)
    return defawlt;

  return atoi(ptr->line);
}

long VTable::GetLong(const char *where, long defawlt)
{
  field *ptr = find_field(where);

  if (!ptr)
    return defawlt;

  return atol(ptr->line);
}

int  VTable::LookupInt(const char *where,
                       const char **lookup_tab, int defawlt)
{
  field *ptr = find_field(where);

  if (!ptr)
    return defawlt;

  int i;
  for (i = 0; *lookup_tab[i] != '\n'; i++)
    if (!str_cmp(ptr->line, lookup_tab[i]))
      return i;

  return defawlt;
}

const char *VTable::GetString(const char *where, const char *defawlt)
{
  field *ptr = find_field(where);

  if (!ptr) {
    return defawlt;
  }

  return (ptr->multiline? ptr->multiline : ptr->line);
}

float VTable::GetFloat(const char *where, float defawlt)
{
  field *ptr = find_field(where);

  if (!ptr)
    return defawlt;

  return (float)atof(ptr->line);
}

const char *VTable::GetIndexField(const char *sect_name, int n)
{
  section *ptr = find_section(sect_name);

  if (!ptr)
    return NULL;

  return ptr->field_tab[n].name;
}

const char *VTable::GetIndexSection(const char *sect_name, int n)
{
  section *ptr = find_section(sect_name);

  if (!ptr)
    return NULL;

  return ptr->sub_tab[n].name;
}

int  VTable::GetIndexInt(const char *sect_name, int n, int defawlt)
{
  section *ptr = find_section(sect_name);

  if (!ptr)
    return defawlt;

  return atoi(ptr->field_tab[n].line);
}

const char *VTable::GetIndexString(const char *sect_name, int n,
                                   const char *defawlt)
{
  section *ptr = find_section(sect_name);

  if (!ptr)
    return defawlt;

  return (ptr->field_tab[n].multiline? ptr->field_tab[n].multiline
          : ptr->field_tab[n].line);
}

void VTable::separate(const char *where,
                      char sect_name[MAX_SECTION_LENGTH],
                      char field_name[MAX_FIELD_LENGTH])
{
  const char *src_ptr = where;
  char *sec_ptr = sect_name, *field_ptr = field_name;

  *sec_ptr = *field_ptr = '\0';

  while (*src_ptr && *src_ptr == ' ')
    src_ptr++;

  char *delim = strchr(src_ptr, '/');

  if (!delim) {
    strncpy(field_name, src_ptr, MAX_FIELD_LENGTH);
    *(field_name + MAX_FIELD_LENGTH - 1) = '\0';
  } else {
    if ((delim-src_ptr) < MAX_SECTION_LENGTH) {
      strncpy(sect_name, src_ptr, delim-src_ptr);
      *(sect_name + (delim-src_ptr)) = '\0';
    } else {
      strncpy(sect_name, src_ptr, MAX_SECTION_LENGTH);
      *(sect_name + MAX_SECTION_LENGTH - 1) = '\0';
    }

    strncpy(field_name, delim+1, MAX_FIELD_LENGTH);
    *(field_name + MAX_FIELD_LENGTH - 1) = '\0';
  }
}

void VTable::resize_subsection_tab(section *ptr, int empty)
{
  if (ptr->sub_tab && ptr->sub_cnt < ptr->sub_size)
    return;

  ptr->sub_size += empty;
  section *new_tab = new section[ptr->sub_size];

  if (ptr->sub_tab) {
    for (int k = 0; k < ptr->sub_cnt; k++)
      new_tab[k] = ptr->sub_tab[k];

    delete [] ptr->sub_tab;
  }

  ptr->sub_tab = new_tab;
}

void VTable::resize_field_tab(section *ptr, int empty)
{
  if (ptr->field_tab && ptr->field_cnt < ptr->field_size)
    return;

  ptr->field_size += empty;
  field *new_tab = new field[ptr->field_size];

  if (ptr->field_tab) {
    for (int k = 0; k < ptr->field_cnt; k++)
      new_tab[k] = ptr->field_tab[k];

    delete [] ptr->field_tab;
  }

  ptr->field_tab = new_tab;
}

VTable::field *VTable::find_field(const char *where)
{
  char sect[MAX_SECTION_LENGTH], field_name[MAX_FIELD_LENGTH];

  separate(where, sect, field_name);

  section *ptr = find_section(sect);

  if (!ptr || !*field_name)
    return NULL;

  for (int i = 0; i < ptr->field_cnt; i++)
    if (!str_cmp(ptr->field_tab[i].name, field_name))
      return (ptr->field_tab+i);

  return NULL;
}

VTable::section *VTable::find_section(const char *sect)
{
  if (!sect || !*sect)
    return &top;

  return (look_for_section(&top, sect));
}

VTable::section *VTable::look_for_section(section *ptr,
    const char *name)
{
  if (!ptr)
    return NULL;

  if (!str_cmp(ptr->name, name))
    return ptr;

  for (int i = 0; i < ptr->sub_cnt; i++) {
    section *ret = look_for_section(ptr->sub_tab+i, name);

    if (ret)
      return ret;
  }

  return NULL;
}

int  VTable::count_subsections(const section *ptr) const
{
  if (!ptr)
    return 0;

  int count = 0;

  for (int i = 0; i < ptr->sub_cnt; i++)
    count += count_subsections(ptr->sub_tab+i);

  return count;
}








JSteensen  [Team Member]
5/8/2012 3:22:29 PM
Well, tried to drop the const from it on my lunch break, and it threw up at me....I'm reaaaaaaallly stumped on this one.
NimmerMehr  [Team Member]
5/8/2012 7:31:30 PM
please point out line 322 as the compile sees it, after the pre-processor.. if the stuff below is not the correct line 322


const char *src_ptr = where;
<snip>
char *delim = strchr(src_ptr, '/');

http://www.cplusplus.com/reference/clibrary/cstring/strchr/

const char * strchr ( const char * str, int character );
char * strchr ( char * str, int character );
JSteensen  [Team Member]
5/8/2012 9:26:45 PM

Originally Posted By NimmerMehr:
please point out line 322 as the compile sees it, after the pre-processor.. if the stuff below is not the correct line 322


const char *src_ptr = where;
<snip>
char *delim = strchr(src_ptr, '/');

http://www.cplusplus.com/reference/clibrary/cstring/strchr/

const char * strchr ( const char * str, int character );
char * strchr ( char * str, int character );

How do I do that? With all the includes, I am tending to think it is referring to this from the vtable.h:

private:
  static void separate(const char *where,
                       char section[MAX_SECTION_LENGTH],
                       char field[MAX_FIELD_LENGTH]);

  void resize_subsection_tab(section *ptr, int empty = 5);
  void resize_field_tab(section *ptr, int empty = 5);

  field *find_field(const char *where);
  section *find_section(const char *sect);
  section *look_for_section(section *ptr, const char *name);

  int count_subsections(const section *ptr) const;



NimmerMehr  [Team Member]
5/8/2012 10:14:19 PM
you're mismatching types in calling strchr(). read the api in the url and look at your code..... assuming i was looking at the same line 332 that the compiler was.. and the gcc prototypes for strchr are the same as the url's.

different question.. that i don't know.

http://stackoverflow.com/questions/5370539/gcc-preprocessor-output
azych  [Member]
5/8/2012 11:13:10 PM
At line 322 of vtable.cpp:

  char *delim = strchr(src_ptr, '/');


strchr() returns a const char*. Try changing char *delim to const char* delim, i.e.:

const char* delim = strchr(src_ptr, '/');

JSteensen  [Team Member]
5/8/2012 11:18:06 PM

Originally Posted By azych:
At line 322 of vtable.cpp:

  char *delim = strchr(src_ptr, '/');


strchr() returns a const char*. Try changing char *delim to const char* delim, i.e.:

const char* delim = strchr(src_ptr, '/');


BINGO!

Now its throwing one more....hopefully this is the last file with errors:

jrsteensen@devhost:~/sol_dev/src$ make
touch ../bin/awake
rm ../bin/awake
g++ -o ../bin/awake -ggdb act.comm.o act.drive.o act.informative.o act.movement.o act.obj.o act.offensive.o act.other.o act.social.o act.wizard.o ban.o bitfield.o boards.o chargen.o comm.o config.o constants.o db.o dblist.o deck_build.o fight.o file.o graph.o guncreate.o handler.o hedit.o house.o icedit.o iedit.o interpreter.o limits.o magcreate.o mail.o medit.o memory.o mobact.o modify.o newdb.o newmagic.o newmail.o newmatrix.o newshop.o olc.o pocketsec.o pro_create.o quest.o redit.o screen.o spec_assign.o spec_procs.o transport.o utils.o vedit.o vtable.o weather.o zedit.o -lcrypt -L/usr/local/lib -lmysqlclient -lz -lm -lnsl
act.obj.o: In function `give_find_vict(char_data*, char*)':
/home/jrsteensen/sol_dev/src/act.obj.cpp:1477: undefined reference to `fixer(char_data*, void*, int, char*)'
act.obj.o: In function `do_eat(char_data*, char*, int, int)':
/home/jrsteensen/sol_dev/src/act.obj.cpp:1815: undefined reference to `anticoagulant(char_data*, void*, int, char*)'
act.other.o: In function `do_spray(char_data*, char*, int, int)':
/home/jrsteensen/sol_dev/src/act.other.cpp:3703: undefined reference to `spraypaint(char_data*, void*, int, char*)'
spec_assign.o: In function `assign_mobiles()':
/home/jrsteensen/sol_dev/src/spec_assign.cpp:367: undefined reference to `janitor(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:370: undefined reference to `terell_davis(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:375: undefined reference to `aegnor(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:376: undefined reference to `fixer(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:377: undefined reference to `purple_haze_bartender(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:379: undefined reference to `receptionist(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:380: undefined reference to `generic_guard(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:383: undefined reference to `generic_guard(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:384: undefined reference to `hacker(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:385: undefined reference to `janitor(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:386: undefined reference to `fence(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:389: undefined reference to `penumbra_troll(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:390: undefined reference to `receptionist(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:393: undefined reference to `pike(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:394: undefined reference to `jeff(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:397: undefined reference to `captain(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:398: undefined reference to `rodgers(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:399: undefined reference to `delaney(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:400: undefined reference to `generic_guard(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:401: undefined reference to `generic_guard(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:402: undefined reference to `janitor(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:403: undefined reference to `janitor(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:406: undefined reference to `lone_star_park(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:407: undefined reference to `mugger_park(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:408: undefined reference to `janitor(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:409: undefined reference to `gate_guard_park(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:410: undefined reference to `squirrel_park(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:411: undefined reference to `sick_ork(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:412: undefined reference to `adept_guard(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:413: undefined reference to `takehero_tsuyama(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:419: undefined reference to `bio_secretary(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:420: undefined reference to `harlten(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:421: undefined reference to `branson(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:422: undefined reference to `bio_guard(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:423: undefined reference to `worker(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:426: undefined reference to `saeder_guard(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:429: undefined reference to `generic_guard(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:430: undefined reference to `janitor(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:434: undefined reference to `receptionist(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:437: undefined reference to `doctor_scriptshaw(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:438: undefined reference to `huge_troll(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:441: undefined reference to `receptionist(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:445: undefined reference to `crime_mall_guard(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:448: undefined reference to `hacker(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:449: undefined reference to `fence(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:452: undefined reference to `receptionist(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:456: undefined reference to `yukiya_dahoto(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:459: undefined reference to `receptionist(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:462: undefined reference to `smelly(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:463: undefined reference to `receptionist(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:465: undefined reference to `smiths_bouncer(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:466: undefined reference to `matchsticks(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:467: undefined reference to `orkish_truckdriver(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:468: undefined reference to `receptionist(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:469: undefined reference to `painter(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:470: undefined reference to `multnomah_guard(char_data*, void*, int, char*)'
spec_assign.o: In function `assign_objects()':
/home/jrsteensen/sol_dev/src/spec_assign.cpp:504: undefined reference to `desktop(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:505: undefined reference to `desktop(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:506: undefined reference to `desktop(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:507: undefined reference to `desktop(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:508: undefined reference to `desktop(char_data*, void*, int, char*)'
spec_assign.o:/home/jrsteensen/sol_dev/src/spec_assign.cpp:509: more undefined references to `desktop(char_data*, void*, int, char*)' follow
spec_assign.o: In function `assign_objects()':
/home/jrsteensen/sol_dev/src/spec_assign.cpp:518: undefined reference to `clock(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:519: undefined reference to `bank(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:523: undefined reference to `bank(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:524: undefined reference to `anticoagulant(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:525: undefined reference to `anticoagulant(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:526: undefined reference to `vendtix(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:527: undefined reference to `clock(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:528: undefined reference to `clock(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:534: undefined reference to `vending_machine(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:535: undefined reference to `vending_machine(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:536: undefined reference to `hand_held_scanner(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:538: undefined reference to `bank(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:539: undefined reference to `clock(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:540: undefined reference to `clock(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:541: undefined reference to `clock(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:542: undefined reference to `bank(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:543: undefined reference to `bank(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:547: undefined reference to `toggled_invis(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:548: undefined reference to `desktop(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:549: undefined reference to `desktop(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:550: undefined reference to `desktop(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:551: undefined reference to `desktop(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:552: undefined reference to `desktop(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:553: undefined reference to `clock(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:554: undefined reference to `clock(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:555: undefined reference to `portable_gridguide(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:556: undefined reference to `portable_gridguide(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:557: undefined reference to `pocket_sec(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:558: undefined reference to `pocket_sec(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:559: undefined reference to `locker(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:562: undefined reference to `monowhip(char_data*, char_data*, obj_data*, int)'
spec_assign.o: In function `assign_rooms()':
/home/jrsteensen/sol_dev/src/spec_assign.cpp:593: undefined reference to `oceansounds(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:594: undefined reference to `oceansounds(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:595: undefined reference to `roots_office(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:599: undefined reference to `waterfall(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:602: undefined reference to `neophyte_entrance(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:603: undefined reference to `newbie_car(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:604: undefined reference to `auth_room(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:607: undefined reference to `simulate_bar_fight(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:616: undefined reference to `crime_mall_blockade(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:617: undefined reference to `crime_mall_blockade(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:620: undefined reference to `car_dealer(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:621: undefined reference to `car_dealer(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:622: undefined reference to `car_dealer(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:623: undefined reference to `car_dealer(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:624: undefined reference to `car_dealer(char_data*, void*, int, char*)'
spec_assign.o:/home/jrsteensen/sol_dev/src/spec_assign.cpp:625: more undefined references to `car_dealer(char_data*, void*, int, char*)' follow
spec_assign.o: In function `assign_rooms()':
/home/jrsteensen/sol_dev/src/spec_assign.cpp:630: undefined reference to `circulation_fan(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:637: undefined reference to `bouncy_castle(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:638: undefined reference to `rpe_room(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:640: undefined reference to `multnomah_gate(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:641: undefined reference to `multnomah_gate(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:643: undefined reference to `mageskill_hermes(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:644: undefined reference to `mageskill_moore(char_data*, void*, int, char*)'
/home/jrsteensen/sol_dev/src/spec_assign.cpp:648: undefined reference to `traffic(char_data*, void*, int, char*)'
collect2: ld returned 1 exit status
make: *** [../bin/awake.new] Error 1





azych  [Member]
5/8/2012 11:24:44 PM
Looks like a header wasn't included or a source file is missing. I guess I'd look for the prototypes for those functions in the headers and then make sure spec_assign.cpp is including them.
JSteensen  [Team Member]
5/8/2012 11:45:56 PM
The functions are defined in the CPP file...

This is quickly approaching a point of beating my head against a wall. haha.
azych  [Member]
5/8/2012 11:51:36 PM
Are they defined before or after their usage? If a forward declaration isn't made and they're used before they're declared in the code, the compiler won't find them (in GCC, anyway, I assume it's the same in G++).

i.e.:

void somefunc(void); // this is the forward declaration

int someotherfunc(void) {
somefunc();
return 0;
}

void somefunc(void) {
}


versus:

int someotherfunc(void) {
somefunc();
return 0;
}

void somefunc(void) {
}


NimmerMehr  [Team Member]
5/9/2012 12:48:20 AM
does the new version of gcc parse differently?

if his old code compiled fine, then why the hell would gcc be kicking out these undecided errors. perhaps the project once used a different vendor's compiler.

I've had to hunt simple bugs in IBM vs Solaris compilers. (one compiler makes assumptions the other does not, and blammo, weird run-time errors)
azych  [Member]
5/9/2012 12:55:51 AM

Originally Posted By NimmerMehr:
does the new version of gcc parse differently?

if his old code compiled fine, then why the hell would gcc be kicking out these undecided errors. perhaps the project once used a different vendor's compiler.

I've had to hunt simple bugs in IBM vs Solaris compilers. (one compiler makes assumptions the other does not, and blammo, weird run-time errors)

Could have been written for a different compiler. I have never known it to be legal to call a function before defining it (whether through a prototype in a header file, or a forward declaration). I can't see why GCC would change that now.
JSteensen  [Team Member]
5/9/2012 1:01:24 AM
he claims it compiles clean under GCC/G++ 4.1.2.
azych  [Member]
5/9/2012 1:17:29 AM
What software are you trying to compile?
castiel  [Team Member]
5/9/2012 9:00:51 AM
Is this a MUD codebase you're trying to compile?

My guess is it's not linking in the library that has all those functions defined. Make sure these libraries are all installed and are in /usr/local/lib

-lcrypt -L/usr/local/lib -lmysqlclient -lz -lm -lnsl

Also try running make clean and compiling everything from the beginning. Something earlier may not have compiled completely but it doesn't realize it until it tries to link everything at the end
JSteensen  [Team Member]
5/9/2012 10:21:01 AM

Originally Posted By castiel:
Is this a MUD codebase you're trying to compile?

My guess is it's not linking in the library that has all those functions defined. Make sure these libraries are all installed and are in /usr/local/lib

-lcrypt -L/usr/local/lib -lmysqlclient -lz -lm -lnsl

Also try running make clean and compiling everything from the beginning. Something earlier may not have compiled completely but it doesn't realize it until it tries to link everything at the end

Sure is.

I'll look into the libraries. The error shown above was after a make clean.