LNK2001: unresolved external symbol

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.
You're trying to call a function that has no body.

You need to give rapvar_read_name_1 a body.
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++.
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.
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.
So are you saying that:

RAPVAR_READ_NAME_RESP_TYPE * rapvar_read_name_1(RAPVAR_READ_NAME_REQ_TYPE *, CLIENT *);

is just a prototype?
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.
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.