Unresolved external symbol referenced in function error when compiling .dll

I am trying to create a `.dll`and I get the following errors. I can confirm that the `_ki/_kj` are correctly defined in the header file. The `q.lib` file is x86 and my visual studio is also x86 so there shouldn't be any compatibility issues there. I added the path to the `q.lib` in linker general and added `q.lib` in input. I do not seem to be able to figure out where this error comes from. Any suggestions would be much appreciated.

1
2
3
4
5
6
   1
    1>kdbLib.obj : error LNK2019: unresolved external symbol _ki referenced in function _calc
    1>kdbLib.obj : error LNK2019: unresolved external symbol _kj referenced in function _calc
    1>q.lib : warning LNK4272: library machine type 'x64' conflicts with target machine type 'x86'
    1>C:\Users\USER\Desktop\FOLDER1\FOLDER2\kdbLib\Debug\kdbLib.dll : fatal error LNK1120: 2 unresolved externals
    1>Done building project "kdbLib.vcxproj" -- FAILED.
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


header.h
1
2
3
4
5
6
7
8
9
 #pragma once
    
    #ifndef kdbLib_EXPORTS
    #define kdbLib_API_ __declspec(dllexport)
    #else
    #define kdbLib_API_ __declspec(dllimport)
    kdbLib_API_ K calc(K x, K y);
    
    #endif /*kdbLib_h_*/ 


k.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
 #ifndef KX
    #define KX
    typedef char*S, C; typedef unsigned char G; typedef short H; typedef int I; typedef long long J; typedef float E; typedef double F; typedef void V;
    #ifdef __cplusplus
    extern"C" {
    #endif
    #if !defined(KXVER)
    #error "Set KXVER=3 for kdb+3.0 or standalone c-api after 2011-04-20. Otherwise set KXVER=2. e.g. #define KXVER 3 or gcc -DKXVER=3"
    #endif
    #if KXVER>=3
    	typedef struct k0 { signed char m, a, t; C u; I r; union { G g; H h; I i; J j; E e; F f; S s; struct k0*k; struct { J n; G G0[1]; }; }; }*K;
    	typedef struct { G g[16]; }U;
    #define kU(x) ((U*)kG(x))
    #define xU ((U*)xG)
    	extern K ku(U), knt(J, K), ktn(I, J), kpn(S, J);
    	extern I setm(I), ver();
    #define DO(n,x)	{J i=0,_i=(n);for(;i<_i;++i){x;}}
    #else
    	typedef struct k0 { I r; H t, u; union { G g; H h; I i; J j; E e; F f; S s; struct k0*k; struct { I n; G G0[1]; }; }; }*K;
    	extern K ktn(I, I), kpn(S, I);
    #define DO(n,x)	{I i=0,_i=(n);for(;i<_i;++i){x;}}
    #endif
    #ifdef __cplusplus
    }
    #endif
    //#include<string.h>
    // vector accessors, e.g. kF(x)[i] for float&datetime
    #define kG(x)	((x)->G0)
    #define kC(x)	kG(x)
    #define kH(x)	((H*)kG(x))
    #define kI(x)	((I*)kG(x))
    #define kJ(x)	((J*)kG(x))
    #define kE(x)	((E*)kG(x))
    #define kF(x)	((F*)kG(x))
    #define kS(x)	((S*)kG(x))
    #define kK(x)	((K*)kG(x))
    
    //      type bytes qtype     ctype  accessor
    #define KB 1  // 1 boolean   char   kG
    #define UU 2  // 16 guid     U      kU
    #define KG 4  // 1 byte      char   kG
    #define KH 5  // 2 short     short  kH
    #define KI 6  // 4 int       int    kI
    #define KJ 7  // 8 long      long   kJ
    #define KE 8  // 4 real      float  kE
    #define KF 9  // 8 float     double kF
    #define KC 10 // 1 char      char   kC
    #define KS 11 // * symbol    char*  kS
    
    #define KP 12 // 8 timestamp long   kJ (nanoseconds from 2000.01.01)
    #define KM 13 // 4 month     int    kI (months from 2000.01.01)
    #define KD 14 // 4 date      int    kI (days from 2000.01.01)
    
    #define KN 16 // 8 timespan  long   kJ (nanoseconds)
    #define KU 17 // 4 minute    int    kI
    #define KV 18 // 4 second    int    kI
    #define KT 19 // 4 time      int    kI (millisecond)
    
    #define KZ 15 // 8 datetime  double kF (DO NOT USE)
    
    // table,dict
    #define XT 98 //   x->k is XD
    #define XD 99 //   kK(x)[0] is keys. kK(x)[1] is values.
    
    #ifdef __cplusplus
    extern"C" {
    	extern V m9();
    #else
    extern V m9(V);
    #endif
    extern I khpunc(S, I, S, I, I), khpun(const S, I, const S, I), khpu(const S, I, const S), khp(const S, I), okx(K), ymd(I, I, I), dj(I); extern V r0(K), sd0(I), sd0x(I d, I f), kclose(I); extern S sn(S, I), ss(S);
    extern K ee(K), ktj(I, J), ka(I), kb(I), kg(I), kh(I), ki(I), kj(J), ke(F), kf(F), kc(I), ks(S), kd(I), kz(F), kt(I), sd1(I, K(*)(I)), dl(V*f, I),
    knk(I, ...), kp(S), ja(K*, V*), js(K*, S), jk(K*, K), jv(K*k, K), k(I, const S, ...), xT(K), xD(K, K), ktd(K), r1(K), krr(const S), orr(const S), dot(K, K), b9(I, K), d9(K), sslInfo(K x);
    #ifdef __cplusplus 
    }
    #endif
    
    // nulls(n?) and infinities(w?)
    #define nh ((I)0xFFFF8000)
    #define wh ((I)0x7FFF)
    #define ni ((I)0x80000000)
    #define wi ((I)0x7FFFFFFF)
    #define nj ((J)0x8000000000000000LL) 
    #define wj 0x7FFFFFFFFFFFFFFFLL
    #if defined(WIN32) || defined(_WIN32)
    #define nf (log(-1.0))
    #define wf (-log(0.0))
    #define finite _finite
    extern double log(double);
    #else  
    #define nf (0/0.0)
    #define wf (1/0.0)
    #define closesocket(x) close(x)
    #endif 
    
    // remove more clutter
    #define O printf
    #define R return
    #define Z static
    #define P(x,y) {if(x)R(y);}
    #define U(x) P(!(x),0)
    #define SW switch
    #define CS(n,x)	case n:x;break;
    #define CD default
    
    #define ZV Z V
    #define ZK Z K
    #define ZH Z H
    #define ZI Z I
    #define ZJ Z J
    #define ZE Z E
    #define ZF Z F
    #define ZC Z C
    #define ZS Z S
    
    #define K1(f) K f(K x)
    #define K2(f) K f(K x,K y)
    #define TX(T,x) (*(T*)((G*)(x)+8))
    #define xr x->r
    #define xt x->t
    #define xu x->u
    #define xn x->n
    #define xx xK[0]
    #define xy xK[1]
    #define xg TX(G,x)
    #define xh TX(H,x)
    #define xi TX(I,x)
    #define xj TX(J,x)
    #define xe TX(E,x)
    #define xf TX(F,x)
    #define xs TX(S,x)
    #define xk TX(K,x)
    #define xG x->G0
    #define xH ((H*)xG)
    #define xI ((I*)xG)
    #define xJ ((J*)xG)
    #define xE ((E*)xG)
    #define xF ((F*)xG)
    #define xS ((S*)xG)
    #define xK ((K*)xG)
    #define xC xG
    #define xB ((G*)xG)
    
    #endif 


kdbLib.c
1
2
3
4
5
6
7
    #include "k.h"
    #include "header.h"
    
    K calc(K x, K y) {
    	if (x->t != -KJ || y->t != -KJ) { return ki(1); }
    	else { return kj(x->j + y->j); }
    }


This is everything necessary for compilation.

I know this works if I have the kdbLib.c a .def file with EXPORTS calc the q.lib file and I execute it something like
 
cl /DKXVER=3 /LD kdbLib.c kdbLib.def q.lib


The compilation line in linux would be something like
 
gcc -shared -fPIC -DKXVER=3 -I headers/ src/kdbLib.c -o kdbLib.so  


The k.h file is not written by me so it is 100% correct.
Last edited on
q.lib : warning LNK4272: library machine type 'x64'


That seems to indicate that the library is actually not x86. How do you know it is?
Topic archived. No new replies allowed.