Nov 9, 2011 at 9:08pm Nov 9, 2011 at 9:08pm UTC
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 Nov 9, 2011 at 9:54pm UTC
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 Nov 9, 2011 at 10:08pm UTC
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 11:52pm Nov 9, 2011 at 11:52pm UTC
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 Nov 10, 2011 at 12:47am UTC
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 Nov 10, 2011 at 12:53am UTC
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 Nov 10, 2011 at 1:14am UTC
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!!!