LNK2001: unresolved external symbol

Nov 9, 2011 at 9:08pm
Can someone tell me why my linker is choking on this:

#include "StdAfx.h"
#include <stdlib.h>

struct RAPVAR_READ_NAME_RESP_TYPE {};
typedef struct RAPVAR_READ_NAME_RESP_TYPE RAPVAR_READ_NAME_RESP_TYPE;

RAPVAR_READ_NAME_RESP_TYPE * rapvar_read_name_1();

static int fnRapReadPos()
{
RAPVAR_READ_NAME_RESP_TYPE *result;
result = rapvar_read_name_1();
return(0);
}

int _tmain(int argc, _TCHAR* argv[])
{
fnRapReadPos();
return 0;
}

The compiler returns the error:

error LNK2001: unresolved external symbol "struct RAPVAR_READ_NAME_RESP_TYPE * __cdecl rapvar_read_name_1(void)" (?rapvar_read_name_1@@YAPAURAPVAR_READ_NAME_RESP_TYPE@@XZ)

yet when I comment out line 12 ("result = rapvar_read_name_1();") I get no errors at all.

I am running VS2010.
Nov 9, 2011 at 9:54pm
You're trying to call a function that has no body.

You need to give rapvar_read_name_1 a body.
Nov 9, 2011 at 10:08pm
Body? What's a body?
I cut a lot of the code out as it has over 400 lines and I did not want to tax everyone's attention span because I have been working on this error for 3 days and I'm desperate.

The code looks a little more like this:


#include "StdAfx.h"
#include <stdlib.h>
#include <iostream>
#include <memory.h> /* for memset */
#include <string>
#include "DB.h"
#include "IG.h"

#define _RAP_H_RPCGEN

using namespace std;

typedef u_char RAP_BYTE_TYPE;
typedef u_short RAP_USHORT_TYPE;
typedef char *RAP_STRING_TYPE;
typedef RAP_USHORT_TYPE RAPVAR_DOMAIN_TYPE;

struct RAPVAR_NAME_TYPE {
RAP_STRING_TYPE name;
RAP_STRING_TYPE type;
RAPVAR_DOMAIN_TYPE domain;
short number1;
short number2;
};
typedef struct RAPVAR_NAME_TYPE RAPVAR_NAME_TYPE;


struct RAP_HEAD_TYPE {
long userdef;
long data1;
};
typedef struct RAP_HEAD_TYPE RAP_HEAD_TYPE;

typedef float RAPVAR_NUM_TYPE;
typedef RAP_STRING_TYPE RAPVAR_STRING_TYPE;
typedef float RAPVAR_BOOL_TYPE;
typedef int RAPVAR_NUMBER_TYPE;
typedef short RAPVAR_SHORT_TYPE;

struct RAPVAR_ARRAY_DIM_TYPE {
RAPVAR_SHORT_TYPE dimension;
RAPVAR_SHORT_TYPE elements[6];
};
typedef struct RAPVAR_ARRAY_DIM_TYPE RAPVAR_ARRAY_DIM_TYPE;


struct RAPVAR_CONFDATA_TYPE {
RAPVAR_NUM_TYPE cf1;
RAPVAR_NUM_TYPE cf4;
RAPVAR_NUM_TYPE cf6;
RAPVAR_NUM_TYPE cfx;
};
typedef struct RAPVAR_CONFDATA_TYPE RAPVAR_CONFDATA_TYPE;


struct RAPVAR_EXTJOINT_TYPE {
RAPVAR_NUM_TYPE eax_a;
RAPVAR_NUM_TYPE eax_b;
RAPVAR_NUM_TYPE eax_c;
RAPVAR_NUM_TYPE eax_d;
RAPVAR_NUM_TYPE eax_e;
RAPVAR_NUM_TYPE eax_f;
};
typedef struct RAPVAR_EXTJOINT_TYPE RAPVAR_EXTJOINT_TYPE;


struct RAPVAR_ORIENT_TYPE {
RAPVAR_NUM_TYPE q1;
RAPVAR_NUM_TYPE q2;
RAPVAR_NUM_TYPE q3;
RAPVAR_NUM_TYPE q4;
};
typedef struct RAPVAR_ORIENT_TYPE RAPVAR_ORIENT_TYPE;


struct RAPVAR_POS_TYPE {
RAPVAR_NUM_TYPE x;
RAPVAR_NUM_TYPE y;
RAPVAR_NUM_TYPE z;
};
typedef struct RAPVAR_POS_TYPE RAPVAR_POS_TYPE;


struct RAPVAR_ROBTARGET_TYPE {
RAPVAR_POS_TYPE trans;
RAPVAR_ORIENT_TYPE rot;
RAPVAR_CONFDATA_TYPE robconf;
RAPVAR_EXTJOINT_TYPE extax;
};
typedef struct RAPVAR_ROBTARGET_TYPE RAPVAR_ROBTARGET_TYPE;


struct RAPVAR_CURR_ROBTARGET_TYPE {
RAPVAR_ROBTARGET_TYPE robtarget;
RAPVAR_STRING_TYPE wobj;
RAPVAR_STRING_TYPE toolobj;
};
typedef struct RAPVAR_CURR_ROBTARGET_TYPE RAPVAR_CURR_ROBTARGET_TYPE;


struct RAPVAR_DATA_TYPE {
RAPVAR_NUMBER_TYPE var_type;
union {
RAPVAR_NUM_TYPE num;
long raplong;
RAPVAR_STRING_TYPE charstring;
RAPVAR_BOOL_TYPE boolean;
RAPVAR_CONFDATA_TYPE confdata;
RAPVAR_EXTJOINT_TYPE extjoint;
RAPVAR_ORIENT_TYPE orient;
RAPVAR_POS_TYPE pos;
RAPVAR_ROBTARGET_TYPE robtarget;
RAPVAR_CURR_ROBTARGET_TYPE robposdata;
} RAPVAR_DATA_TYPE_u;
};
typedef struct RAPVAR_DATA_TYPE RAPVAR_DATA_TYPE;


struct RAPVAR_READ_NAME_REQ_TYPE {
RAP_HEAD_TYPE head;
RAPVAR_NAME_TYPE var;
};
typedef struct RAPVAR_READ_NAME_REQ_TYPE RAPVAR_READ_NAME_REQ_TYPE;


struct RAPVAR_READ_NAME_RESPX_TYPE {
long status;
union {
RAPVAR_DATA_TYPE data;
} RAPVAR_READ_NAME_RESPX_TYPE_u;
};
typedef struct RAPVAR_READ_NAME_RESPX_TYPE RAPVAR_READ_NAME_RESPX_TYPE;


struct RAPVAR_READ_NAME_RESP_TYPE {
RAP_HEAD_TYPE head;
RAPVAR_READ_NAME_RESPX_TYPE resp;
};
typedef struct RAPVAR_READ_NAME_RESP_TYPE RAPVAR_READ_NAME_RESP_TYPE;

#define OTHER_SERVICES 300456
#define OTHER_SERVICES_VERS 1

#define FALSE 0
#define TRUE 1
typedef int bool_t;
typedef int enum_t;
typedef unsigned long int u_int32;
typedef char* caddr_t;
typedef unsigned short int ushort_t;

//The AUTH structure

union des_block {
struct {
u_int32 high;
u_int32 low;
} key;
char c[8];
};
typedef union des_block des_block;
bool_t xdr_des_block();

/*
* Authentication info. Opaque to client.
*/
struct opaque_auth {
enum_t oa_flavor; /* flavor of auth */
caddr_t oa_base; /* address of more auth stuff */
u_int oa_length; /* not to exceed MAX_AUTH_BYTES */
};

/*
* Auth handle, interface to client side authenticators.
*/
typedef struct {
struct opaque_auth ah_cred;
struct opaque_auth ah_verf;
union des_block ah_key;
struct auth_ops {
void (*ah_nextverf)();
int (*ah_marshal)(); /* nextverf & serialize */
int (*ah_validate)(); /* validate varifier */
int (*ah_refresh)(); /* refresh credentials */
void (*ah_destroy)(); /* destroy this structure */
} *ah_ops;
caddr_t ah_private;
} AUTH;

typedef struct {
AUTH *cl_auth; /* authenticator */
struct clnt_ops {
enum clnt_stat (*cl_call)(); /* call remote procedure */
void (*cl_abort)(); /* abort a call */
void (*cl_geterr)(); /* get specific error code */
bool_t (*cl_freeres)(); /* frees results */
void (*cl_destroy)(); /* destroy this structure */
bool_t (*cl_control)(); /* the ioctl() of rpc */
} *cl_ops;
caddr_t cl_private; /* private stuff */
char *cl_netid; /* network token */
char *cl_tp; /* device name */
} CLIENT;

struct netbuf {
unsigned int maxlen; /* max length */
unsigned int len; /* current length */
char *buf; /* data */
};

#define rapvar_read_name 1001
RAPVAR_READ_NAME_RESP_TYPE * rapvar_read_name_1(RAPVAR_READ_NAME_REQ_TYPE *, CLIENT *);
RAPVAR_READ_NAME_RESP_TYPE * rapvar_read_name_1_svc(RAPVAR_READ_NAME_REQ_TYPE *, struct svc_req *);

static int fnRapReadPos()
{
int Pclient=1;
DBint *pstat=0;
CLIENT *clnt;
RAPVAR_READ_NAME_RESP_TYPE *result;
RAPVAR_READ_NAME_REQ_TYPE request;

clnt=(CLIENT*)(void*)Pclient;

request.head.userdef=1;
request.var.name="name";
request.var.type="robposdata";
request.var.domain=1;
request.var.number1=0;
request.var.number2=26;

result = rapvar_read_name_1(&request, clnt);

if (result == (RAPVAR_READ_NAME_RESP_TYPE *) NULL)
{
*pstat = -1;
return(0);
}
*pstat = result->resp.status; /*status >= 0 is ok */
return(0);
}


int _tmain(int argc, _TCHAR* argv[])
{
fnRapReadPos();
return 0;
}
And the error is this:

1>RAPConsole00.obj : error LNK2019: unresolved external symbol "struct RAPVAR_READ_NAME_RESP_TYPE * __cdecl rapvar_read_name_1(struct RAPVAR_READ_NAME_REQ_TYPE *,struct CLIENT *)" (?rapvar_read_name_1@@YAPAURAPVAR_READ_NAME_RESP_TYPE@@PAURAPVAR_READ_NAME_REQ_TYPE@@PAUCLIENT@@@Z) referenced in function "int __cdecl fnRapReadPos(void)" (?fnRapReadPos@@YAHXZ)
1>C:\Documents and Settings\eb\My Documents\ABB Projects\RAPConsole00\Debug\RAPConsole00.exe : fatal error LNK1120: 1 unresolved externals

And YES I'm new to c++.
Nov 9, 2011 at 10:10pm
The body is the code for the function.

1
2
3
4
5
6
7
int myfunction();  // this is just a prototype, no body

int myfunction()
{
  // this is the body
  //   ... the code that is actually run when the function is called
}


"Unresolved external symbol" errors mean that the linker cannot find the body for the function, so it doesn't know what code you want to run.
Nov 9, 2011 at 11:52pm
Ah but in the longer version that I posted it does have a body:


struct RAPVAR_READ_NAME_RESP_TYPE {
RAP_HEAD_TYPE head;
RAPVAR_READ_NAME_RESPX_TYPE resp;
};
...

RAPVAR_READ_NAME_RESP_TYPE * rapvar_read_name_1(RAPVAR_READ_NAME_REQ_TYPE *, CLIENT *);
...

RAPVAR_READ_NAME_RESP_TYPE *result;
result = rapvar_read_name_1(&request, clnt);

Yet I still get the LNK2019 error.
Nov 10, 2011 at 12:47am
So are you saying that:

RAPVAR_READ_NAME_RESP_TYPE * rapvar_read_name_1(RAPVAR_READ_NAME_REQ_TYPE *, CLIENT *);

is just a prototype?
Nov 10, 2011 at 12:53am
RAPVAR_READ_NAME_RESP_TYPE * rapvar_read_name_1(RAPVAR_READ_NAME_REQ_TYPE *, CLIENT *); is just a prototype. Hoow do you know what the function actually does? Where's the code? That's the bit the linker can't find.
Nov 10, 2011 at 1:14am
BRILLIANT!!!!!

I found the missing bit. I was looking for the problem up front when I should have been looking for it at the bottom.

Thanks fellas!!!
Topic archived. No new replies allowed.