Undefined References in Plain C DLL Compilations Topic is solved

Do you have a question about makefiles, a compiler or IDE you are using and need to know how to set it up for wxWidgets or why it doesn't compile but other IDE's do ? Post your questions here.
Post Reply
User avatar
ColleenKobe
Earned some good credits
Earned some good credits
Posts: 109
Joined: Mon Aug 31, 2015 3:47 pm

Undefined References in Plain C DLL Compilations

Post by ColleenKobe »

Hi. I have a CodeLite workspace that contains two plain C projects. The projects both compile to *.dlls. One project, called Essentials (global variables and utility functions) is compiled first into Essentials.dll. The second project, called Reader, invokes Essentials.dll in its compilation.

I am building 32-bit debug versions of both projects.

Essentials compiles error-free, and results in Essentials.dll.

Reader has problems. The compiler finds the procedures and functions appearing in Essentials.dll, and defined in the two *.h files containing extern declarations for Essentials. But it does not find the global variables.

I looked at Essentials.dll with Dependency Walker. I do see the procedures and functions, and I don't see the variables.

Global variables are supposed to appear in a DLL, aren't they?

Suggestions?

Note: Yes, I know that global variables are a bad idea. I know I should write Get/Set code for each global variable. But I am translating a very large VB6 program into C, and the original program had global variables, and he wants my C code to follow the VB6 code as closely as possible, so he knows what's going on.

Software Versions:
------------------
CodeLite = 9.1.5
tdm-gcc = 5.1.0.3
Windows 7 = 6.1

Clean Workspace:

Code: Select all

C:\Windows\system32\cmd.exe /C C:/TDM-GCC-32/bin/mingw32-make.exe -e -f  "Essentials.mk"  clean
----------Cleaning project:[ Essentials - Debug ]----------
rm -f -r ./Debug/
====0 errors, 0 warnings====
C:\Windows\system32\cmd.exe /C C:/TDM-GCC-32/bin/mingw32-make.exe -e -f  "Reader.mk"  clean
----------Cleaning project:[ Reader - Debug ]----------
rm -f -r ./Debug/
====0 errors, 0 warnings====
Build Workspace:

Code: Select all

C:\Windows\system32\cmd.exe /C C:/TDM-GCC-32/bin/mingw32-make.exe -e -f  "Essentials.mk"  MakeIntermediateDirs && C:/TDM-GCC-32/bin/mingw32-make.exe -e -f  "Essentials.mk"  all
----------Building project:[ Essentials - Debug ]----------
gcc -shared -fPIC -o df_Essentials.dll @"Essentials.txt" -L.   -Wl,--add-stdcall-alias -Wl,--add-stdcall-alias
====0 errors, 0 warnings====
C:\Windows\system32\cmd.exe /C C:/TDM-GCC-32/bin/mingw32-make.exe -e -f  "Reader.mk"  MakeIntermediateDirs && C:/TDM-GCC-32/bin/mingw32-make.exe -e -f  "Reader.mk"  all
----------Building project:[ Reader - Debug ]----------
gcc -shared -fPIC -o df_Reader.dll @"Reader.txt" -L.  -ldf_Essentials  -Wl,--add-stdcall-alias
./Debug/dfvrd.c.o: In function `Screamin_Fast_Read_Write':
F:/DigFV_WS/dfvrd.c:447: undefined reference to `_imp__FT_GetQueueStatus@8'
F:/DigFV_WS/dfvrd.c:513: undefined reference to `_imp__FT_Read@16'
F:/DigFV_WS/dfvrd.c:529: undefined reference to `g_mem_TotalBytesRead'
F:/DigFV_WS/dfvrd.c:529: undefined reference to `g_mem_TotalBytesRead'
F:/DigFV_WS/dfvrd.c:581: undefined reference to `g_mem_TotalBytesWritten'
F:/DigFV_WS/dfvrd.c:581: undefined reference to `g_mem_TotalBytesWritten'
F:/DigFV_WS/dfvrd.c:582: undefined reference to `g_mem_QtyWritesExecuted'
F:/DigFV_WS/dfvrd.c:582: undefined reference to `g_mem_QtyWritesExecuted'
./Debug/dfvrd.c.o: In function `dfvrd_Read_Loop@0':
F:/DigFV_WS/dfvrd.c:641: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:641: undefined reference to `_imp__FT_Purge@8'
F:/DigFV_WS/dfvrd.c:666: undefined reference to `g_mem_DigFVCommands'
F:/DigFV_WS/dfvrd.c:671: undefined reference to `g_mem_DigFVCommands'
F:/DigFV_WS/dfvrd.c:671: undefined reference to `g_mem_DigFVCommands'
F:/DigFV_WS/dfvrd.c:684: undefined reference to `g_mem_DigFVCommands'
F:/DigFV_WS/dfvrd.c:684: undefined reference to `g_mem_DigFVCommands'
F:/DigFV_WS/dfvrd.c:754: undefined reference to `_imp__FT_Write@16'
F:/DigFV_WS/dfvrd.c:809: undefined reference to `g_mem_QtyReadLoopsExecuted'
F:/DigFV_WS/dfvrd.c:809: undefined reference to `g_mem_QtyReadLoopsExecuted'
F:/DigFV_WS/dfvrd.c:825: undefined reference to `g_mem_ReadLoopController'
F:/DigFV_WS/dfvrd.c:826: undefined reference to `g_mem_ThreadController'
F:/DigFV_WS/dfvrd.c:908: undefined reference to `g_mem_ThreadController'
F:/DigFV_WS/dfvrd.c:909: undefined reference to `g_mem_ThreadStatus'
F:/DigFV_WS/dfvrd.c:911: undefined reference to `g_mem_ReadLoopController'
F:/DigFV_WS/dfvrd.c:912: undefined reference to `g_mem_ReadLoopStatus'
F:/DigFV_WS/dfvrd.c:913: undefined reference to `g_mem_ReadLoop_Running'
F:/DigFV_WS/dfvrd.c:921: undefined reference to `_imp__FT_Close@4'
./Debug/dfvrd.c.o: In function `dfvrd_Close_DigFV_Handle@12':
F:/DigFV_WS/dfvrd.c:968: undefined reference to `_imp__FT_Close@4'
./Debug/dfvrd.c.o: In function `dfvrd_Close_Connection@4':
F:/DigFV_WS/dfvrd.c:1016: undefined reference to `g_mem_DigFV_Handle_is_Open'
F:/DigFV_WS/dfvrd.c:1019: undefined reference to `g_mem_DigFV_Handle_is_Open'
F:/DigFV_WS/dfvrd.c:1019: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1022: undefined reference to `g_mem_TotalBytesRead'
F:/DigFV_WS/dfvrd.c:1026: undefined reference to `g_mem_DigFV_Handle_is_Open'
F:/DigFV_WS/dfvrd.c:1029: undefined reference to `g_mem_PRD_File_Opened'
./Debug/dfvrd.c.o: In function `dfvrd_Close_PRD_File@4':
F:/DigFV_WS/dfvrd.c:1077: undefined reference to `g_mem_PRD_File_Opened'
F:/DigFV_WS/dfvrd.c:1097: undefined reference to `g_mem_PRD_Filename'
F:/DigFV_WS/dfvrd.c:1098: undefined reference to `g_mem_PRD_File_Opened'
F:/DigFV_WS/dfvrd.c:1103: undefined reference to `g_mem_Debug_File_Opened'
F:/DigFV_WS/dfvrd.c:1111: undefined reference to `g_mem_Debug_Filename'
F:/DigFV_WS/dfvrd.c:1112: undefined reference to `g_mem_Debug_File_Opened'
./Debug/dfvrd.c.o: In function `dfvrd_Get_Message@16':
F:/DigFV_WS/dfvrd.c:1208: undefined reference to `g_mem_DigFV_Handle_is_Open'
F:/DigFV_WS/dfvrd.c:1225: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1225: undefined reference to `_imp__FT_Write@16'
F:/DigFV_WS/dfvrd.c:1242: undefined reference to `g_mem_DigFV_Handle_is_Open'
F:/DigFV_WS/dfvrd.c:1245: undefined reference to `g_mem_ReadLoopStatus'
F:/DigFV_WS/dfvrd.c:1246: undefined reference to `g_mem_ReadLoop_Running'
F:/DigFV_WS/dfvrd.c:1262: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1262: undefined reference to `_imp__FT_GetQueueStatus@8'
F:/DigFV_WS/dfvrd.c:1289: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1289: undefined reference to `_imp__FT_GetQueueStatus@8'
F:/DigFV_WS/dfvrd.c:1316: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1316: undefined reference to `_imp__FT_Read@16'
./Debug/dfvrd.c.o: In function `dfvrd_Initialize@0':
F:/DigFV_WS/dfvrd.c:1470: undefined reference to `g_mem_Debug_Filename'
F:/DigFV_WS/dfvrd.c:1471: undefined reference to `g_mem_PRD_Filename'
F:/DigFV_WS/dfvrd.c:1474: undefined reference to `g_mem_Debug_Filename'
F:/DigFV_WS/dfvrd.c:1474: undefined reference to `g_mem_Debug_Filename'
F:/DigFV_WS/dfvrd.c:1474: undefined reference to `g_mem_Debug_Filename'
F:/DigFV_WS/dfvrd.c:1474: undefined reference to `g_mem_Debug_Filename'
F:/DigFV_WS/dfvrd.c:1474: undefined reference to `g_mem_Debug_Filename'
./Debug/dfvrd.c.o:F:/DigFV_WS/dfvrd.c:1474: more undefined references to `g_mem_Debug_Filename' follow
./Debug/dfvrd.c.o: In function `dfvrd_Initialize@0':
F:/DigFV_WS/dfvrd.c:1475: undefined reference to `g_mem_PRD_Filename'
F:/DigFV_WS/dfvrd.c:1475: undefined reference to `g_mem_PRD_Filename'
F:/DigFV_WS/dfvrd.c:1475: undefined reference to `g_mem_PRD_Filename'
F:/DigFV_WS/dfvrd.c:1475: undefined reference to `g_mem_PRD_Filename'
F:/DigFV_WS/dfvrd.c:1475: undefined reference to `g_mem_PRD_Filename'
./Debug/dfvrd.c.o:F:/DigFV_WS/dfvrd.c:1475: more undefined references to `g_mem_PRD_Filename' follow
./Debug/dfvrd.c.o: In function `dfvrd_Initialize@0':
F:/DigFV_WS/dfvrd.c:1479: undefined reference to `g_mem_Debug_File_Opened'
F:/DigFV_WS/dfvrd.c:1480: undefined reference to `g_mem_DigFV_Handle_is_Open'
F:/DigFV_WS/dfvrd.c:1481: undefined reference to `g_mem_PRD_File_Opened'
F:/DigFV_WS/dfvrd.c:1482: undefined reference to `g_mem_TotalBytesRead'
F:/DigFV_WS/dfvrd.c:1483: undefined reference to `g_mem_TotalBytesWritten'
F:/DigFV_WS/dfvrd.c:1484: undefined reference to `g_mem_QtyReadLoopsExecuted'
F:/DigFV_WS/dfvrd.c:1485: undefined reference to `g_mem_QtyWritesExecuted'
./Debug/dfvrd.c.o: In function `dfvrd_Open_Connection@4':
F:/DigFV_WS/dfvrd.c:1623: undefined reference to `g_mem_DigFV_Handle_is_Open'
F:/DigFV_WS/dfvrd.c:1623: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1626: undefined reference to `g_mem_DigFV_Handle_is_Open'
F:/DigFV_WS/dfvrd.c:1629: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1629: undefined reference to `_imp__FT_SetUSBParameters@12'
F:/DigFV_WS/dfvrd.c:1637: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1637: undefined reference to `_imp__FT_Purge@8'
F:/DigFV_WS/dfvrd.c:1640: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1640: undefined reference to `_imp__FT_ResetDevice@4'
F:/DigFV_WS/dfvrd.c:1650: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1650: undefined reference to `_imp__FT_SetTimeouts@12'
F:/DigFV_WS/dfvrd.c:1660: undefined reference to `g_mem_DigFV_Handle_is_Open'
./Debug/dfvrd.c.o: In function `dfvrd_Open_DigFV_Handle@12':
F:/DigFV_WS/dfvrd.c:1706: undefined reference to `_imp__FT_Open@8'
./Debug/dfvrd.c.o: In function `dfvrd_Open_PRD_File@4':
F:/DigFV_WS/dfvrd.c:1779: undefined reference to `g_mem_TotalBytesRead'
F:/DigFV_WS/dfvrd.c:1782: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1782: undefined reference to `_imp__FT_Purge@8'
F:/DigFV_WS/dfvrd.c:1784: undefined reference to `g_mem_PRD_File_Opened'
F:/DigFV_WS/dfvrd.c:1792: undefined reference to `g_mem_PRD_Filename'
F:/DigFV_WS/dfvrd.c:1795: undefined reference to `g_mem_PRD_Filename'
F:/DigFV_WS/dfvrd.c:1807: undefined reference to `g_mem_PRD_Filename'
F:/DigFV_WS/dfvrd.c:1810: undefined reference to `g_mem_PRD_File_Opened'
./Debug/dfvrd.c.o: In function `GetLatencyTime':
F:/DigFV_WS/dfvrd.c:1849: undefined reference to `g_mem_DigFV_Handle_is_Open'
F:/DigFV_WS/dfvrd.c:1855: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1855: undefined reference to `_imp__FT_GetLatencyTimer@8'
./Debug/dfvrd.c.o: In function `SetLatencyTime':
F:/DigFV_WS/dfvrd.c:1898: undefined reference to `g_mem_DigFV_Handle_is_Open'
F:/DigFV_WS/dfvrd.c:1904: undefined reference to `g_mem_DigFV_Handle'
F:/DigFV_WS/dfvrd.c:1904: undefined reference to `_imp__FT_SetLatencyTimer@8'
./Debug/threads.c.o: In function `thrd_End_Thread@0':
F:/DigFV_WS/threads.c:75: undefined reference to `g_mem_thrdHandle'
./Debug/threads.c.o: In function `thrd_Initialize@0':
F:/DigFV_WS/threads.c:102: undefined reference to `g_mem_ThreadController'
F:/DigFV_WS/threads.c:103: undefined reference to `g_mem_ThreadStatus'
F:/DigFV_WS/threads.c:105: undefined reference to `g_mem_ReadLoopController'
F:/DigFV_WS/threads.c:106: undefined reference to `g_mem_ReadLoopStatus'
F:/DigFV_WS/threads.c:107: undefined reference to `g_mem_ReadLoop_Running'
./Debug/threads.c.o: In function `thrd_New_Thread@0':
F:/DigFV_WS/threads.c:156: undefined reference to `g_mem_thrdHandle'
F:/DigFV_WS/threads.c:160: undefined reference to `g_mem_thrdHandle'
F:/DigFV_WS/threads.c:167: undefined reference to `g_mem_thrdHandle'
F:/DigFV_WS/threads.c:171: undefined reference to `g_mem_ThreadStatus'
F:/DigFV_WS/threads.c:172: undefined reference to `g_mem_ThreadController'
F:/DigFV_WS/threads.c:183: undefined reference to `g_mem_ThreadController'
F:/DigFV_WS/threads.c:184: undefined reference to `g_mem_ThreadStatus'
F:/DigFV_WS/threads.c:186: undefined reference to `g_mem_ReadLoopController'
F:/DigFV_WS/threads.c:187: undefined reference to `g_mem_ReadLoopStatus'
F:/DigFV_WS/threads.c:188: undefined reference to `g_mem_ReadLoop_Running'
F:/DigFV_WS/threads.c:195: undefined reference to `g_mem_thrdHandle'
F:/DigFV_WS/threads.c:196: undefined reference to `g_mem_thrdHandle'
./Debug/threads.c.o: In function `thrd_Read_Loop_Control@4':
F:/DigFV_WS/threads.c:306: undefined reference to `g_mem_ReadLoopController'
F:/DigFV_WS/threads.c:307: undefined reference to `g_mem_ThreadController'
F:/DigFV_WS/threads.c:311: undefined reference to `g_mem_ReadLoopController'
F:/DigFV_WS/threads.c:312: undefined reference to `g_mem_ThreadController'
./Debug/threads.c.o: In function `thrd_Start_Thread@0':
F:/DigFV_WS/threads.c:345: undefined reference to `g_mem_DigFV_Handle_is_Open'
F:/DigFV_WS/threads.c:346: undefined reference to `g_mem_DigFV_Handle_is_Open'
F:/DigFV_WS/threads.c:346: undefined reference to `g_mem_DigFV_Handle'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe: *** [df_Reader.dll] Error 1
Reader.mk:81: recipe for target 'df_Reader.dll' failed
====124 errors, 0 warnings====
User avatar
doublemax
Moderator
Moderator
Posts: 19103
Joined: Fri Apr 21, 2006 8:03 pm
Location: $FCE2

Re: Undefined References in Plain C DLL Compilations

Post by doublemax »

Please show the headerfile of the DLL that contains the exported variables and functions.
Use the source, Luke!
User avatar
ColleenKobe
Earned some good credits
Earned some good credits
Posts: 109
Joined: Mon Aug 31, 2015 3:47 pm

Re: Undefined References in Plain C DLL Compilations

Post by ColleenKobe »

doublemax wrote:Please show the headerfile of the DLL that contains the exported variables and functions.
Thank you for reading this message, doublemax.

I had two problems that caused these errors.

1. I only had the *.dll version of the file in the default directory. I also found the *.lib version of the file and copied it into the default directory.

2. I had listed the entire file name (filename and extension) of the library file in CodeLite in the field: Project, Settings, Global Settings, and then Libraries.

I read some similar posts here on the wxWidgets forum. I was very lucky to find a comment by one person who mentioned that the tdm-gcc linker does not like to see extensions on library file names. It seemed unlikely that that would matter, but I removed the extension of the file in CodeLite.

Voila! Once I added the *.lib version of the file to the default directory, and removed the extension from the CodeLite load options field, the program compiled and linked. I now have a DLL.

Here is a screen shot of a successful compilation and linking.
Successful_Linking_Reader.jpg
So, now that I write this down, I guess I don't know if the linker is using the dll or the lib file. But I guess for now, it doesn't matter.

This problem is solved.

Thank you again for offering to help.
Post Reply