<div dir="ltr">I will pay $100 to the first person that can solve my problem of linking a compiled C static library to a Free Pascal program on Windows.<div><br></div><div>Recently I have been building many C libraries with GCC on Linux and linking them to Free Pascal. These include building C libraries such as "libxmp" for decoding mod/tracker music into PCM audio samples, "libchuimpmunk2d" for simulating 2D solid body physics, or "libsdl2" for cross platform controller input and haptic feedback among other things.</div><div><br></div><div>So far on Linux I am happily able to use a cmake/make/gcc toolchain to build these C libraries from source and easily statically link them to my Free Pascal programs.</div><div><br></div><div>Here is an example and abbreviated Pascal unit that links to a static build of Chimpmunk 2D:</div><div><br></div><div>unit Chimpmunk2D;</div><div><br></div><div>interface</div><div><br></div><div>type</div><div>  cpSpace = Pointer;</div><div><br></div><div>function cpSpaceNew: cpSpace; cdecl; external;<br>procedure cpSpaceDestroy(space: cpSpace); cdecl; external;<br></div><div><br></div><div>implementation</div><div><br></div><div>{$ifdef linux}<br>  {$linklib c}<br>  {$linklib m}<br>  {$linklib chipmunk-linux}<br>{$endif}<br></div><div><br></div><div>end.</div><div><br></div><div>Where libchipmunk-linux.a is my static library build on Linux from the Chipmunk2D C source code and is in the same folder as the source code as "Chimpmunk2D.pas". This works fine on Linux.</div><div><br></div><div>I am also able to use mingw32 gcc to compile this same C source into a static library for Windows using these two commands while inside the folder containing the Chipmunk2D sources:</div><div><br></div><div>x86_64-w64-mingw32-gcc-win32 -static -static-libgcc -std=gnu99 -ffast-math src/*.c -Iinclude -c<br></div><div>x86_64-w64-mingw32-ar rcs libchipmunk-win.a *.o<br></div><div>rm *.o</div><div><br></div><div>The problem then arises when I try to use {$linklib chipmunk-win}. No matter how I try to arrange the static dependencies I cannot resolve missing functions. </div><div><br></div><div>Many attempts were made compiling against other mingw32 static libraries for Windows.</div><div><br></div><div><div>{$ifdef windows}<br>  {$linklib mingw32}<br>  {$linklib mingwex}<br>  {$linklib kernel32}<br>  {$linklib msvcrt}<br>  {$linklib chipmunk-win}<br>{$endif}<br></div><div><br></div></div><div><div>I get many errors similar to these below:</div><div><br></div></div><div>Verbose: Compiling resource C:\Development\Projects\physics\lib\x86_64-win64\Physics.obj<br>Verbose: Linking C:\Development\Pascal\Projects\physics\Physics.exe<br>Physics.lpr(30,1) Error: Undefined symbol: ___chkstk_ms<br>Physics.lpr(30,1) Error: Undefined symbol: __mingw_raise_matherr<br>Physics.lpr(30,1) Error: Undefined symbol: __imp_WideCharToMultiByte<br>Physics.lpr(30,1) Error: Undefined symbol: __imp_IsDBCSLeadByteEx<br>Physics.lpr(30,1) Error: Undefined symbol: __imp_MultiByteToWideChar<br>Physics.lpr(30,1) Verbose: There were 5 errors compiling module, stopping<br>Verbose: Compilation aborted<br></div><div><br></div><div>BUT</div><div><br></div><div>If I use mingw32-w64 on Linux to create a DLL instead, then m problems on Windows go away.</div><div><br></div><div>x86_64-w64-mingw32-gcc-win32 -static -shared -static-libgcc -std=gnu99 -ffast-math src/*.c -Iinclude -o libchipmunk-win.dll<br></div><div><br></div><div>However, I am not satisfied with an ever growing list of DLLs (I am at 6 currently) that must be deployed on Windows to build / run any project using my Pascal toolkit. I thought I could resolve this static linking problem on Windows at a later date, thus eliminating all the DLLs required to run projects using my toolkit on Windows, but every time I return to try another attempt I cannot resolve the external dependencies of something like "libchipmunk-win.a".</div><div><br></div><div>Therefore, if anyone has expertise in the area of linking static C libraries and can provide an example of how to link just one ("libchipmunk-win.a") on Windows either providing a different Windows C compiling method (MSVC as opposed to x86_64-w64-mingw32-gcc-win32) and the proper directives to correctly link a static library, I would gladly pay that person $100.</div><div><br></div><div>Additionally, I would write up a guide for other people if they have trouble while attempting to do the same thing.</div><div><br></div><div>If you have any tips or suggestions you can respond to this thread. If you have a solution and want to collect the reward, reply to my email address associated with this thread.</div><div><br></div><div>For reference, here are links to Windows static and dynamic libraries I;ve already built. Feel free to build new static libraries yourself, but just be sure to provide the list of tools and arguments you used if sending a solution.</div><div><br></div><div><a href="https://files.codebot.org/sysrpl/applications/libchipmunk-win.a">https://files.codebot.org/sysrpl/applications/libchipmunk-win.a</a><br></div><div><a href="https://files.codebot.org/sysrpl/applications/libchipmunk-win.dll">https://files.codebot.org/sysrpl/applications/libchipmunk-win.dll</a><br></div></div>