I need to rewrite some Delphi code to C++ and we need to link to the dynamic library TMLComm2004.dll
. It turns out that we don't have any .lib
file so we decided to generate it, using the following command lines:
dumpbin /EXPORTS C:\Users\fayard\Desktop\TMLComm2004.dll > C:\Users\fayard\Desktop\TMLComm2004.txt
We obtain the following file
Microsoft (R) COFF/PE Dumper Version 14.00.24215.1
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file C:\Users\fayard\Desktop\TMLComm2004.dll
File Type: DLL
Section contains the following exports for TMLcomm.dll
00000000 characteristics
401F6AD5 time date stamp Tue Feb 3 10:33:09 2004
0.00 version
1 ordinal base
27 number of functions
27 number of names
ordinal hint RVA name
1 0 00001122 _MSK_COFFDownloadFlash@16
2 1 0000114F _MSK_COFFDownloadRAM@20
3 2 0000106E _MSK_CheckSum@12
4 3 00001172 _MSK_CloseComm@0
5 4 00001190 _MSK_GetActiveBoard@4
6 5 0000109B _MSK_GetBoardInfo@8
7 6 0000104B _MSK_GetBytesCountInQueue@0
8 7 0000119A _MSK_GetChar@4
9 8 000010E6 _MSK_GetCharNoWait@4
10 9 000011A4 _MSK_GetCommBaudRate@4
11 A 000010DC _MSK_GetHostBoard@4
12 B 0000108C _MSK_OpenComm@16
13 C 000011DB _MSK_ReceiveData@16
14 D 000011CC _MSK_ReceiveMessage@4
15 E 0000105A _MSK_RegisterReceiveUnsolicitedMsgHandler@4
16 F 000011AE _MSK_ResetMSKBoard@0
17 10 00001037 _MSK_SendChar@4
18 11 000010EB _MSK_SendData@16
19 12 0000126C _MSK_SendMessage@4
20 13 0000128F _MSK_SetActiveBoard@4
21 14 00001136 _MSK_SetB0BlockAsData@4
22 15 0000100A _MSK_SetBoardBaudRate@4
23 16 00001019 _MSK_SetCharMode@4
24 17 00001168 _MSK_SetCommBaudRate@4
25 18 00001050 _MSK_SetDebugWindow@8
26 19 00001276 _MSK_SetHostBoard@4
27 1A 00001046 _MSK_UpdateCommTimeouts@0
Summary
C000 .data
3000 .idata
6000 .rdata
4000 .reloc
21000 .rsrc
3E000 .text
2000 shdata
Then, we have edited the TMLComm2014.txt
file and changed it to a .def
file with the @xx removed. The file looks like:
EXPORTS
_MSK_COFFDownloadFlash
...
Then, we generate a .lib
file with:
lib /def:C:\Users\fayard\Desktop\TMLComm2004.def /out:C:\Users\fayard\Desktop\TMLComm2004.lib
We compile the following program:
extern "C" {
bool MSK_OpenComm(unsigned char a, unsigned short b, bool c, unsigned char d);
}
...
When we compile and link against the .lib
, we get an error:
LNK2019 unresolved external symbol _MSK_OpenComm referenced in function...
What's wrong with what I do?
Update
I have managed to compile with:
extern "C" {
bool __stdcall MSK_OpenComm(unsigned char a, unsigned short b, bool c, unsigned char d);
}
but now the problem is at link time. I am puzzled as from command line, I have:
==================================================
dumpbin /headers TMLComm.lib
Version : 0
Machine : 14C (x86)
TimeDateStamp: 5964C365 Tue Jul 11 14:24:05 2017
SizeOfData : 00000022
DLL name : TMLComm2004.dll
Symbol name : __MSK_OpenComm@16
Type : code
Name type : no prefix
Hint : 11
Name : _MSK_OpenComm@16
==================================================
dumpbin /exports TMLComm.dll
12 B 0000108C _MSK_OpenComm@16
==================================================
Compilation goes fine now, but the problem is at link time:
link tmlcomm.obj Motor.obj main.obj TMLComm.lib /out:main.exe
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation. All rights reserved.
tmlcomm.obj : error LNK2019: unresolved external symbol _MSK_OpenComm@16 referenced in function "bool __cdecl msk_opencomm(unsigned char,unsigned short,bool,unsigned char)" (?msk_opencomm@@YA_NEG_NE@Z)
Teclis.exe : fatal error LNK1120: 1 unresolved externals