c3c icon indicating copy to clipboard operation
c3c copied to clipboard

Standard libraries not included when using MinGW-w64 GCC

Open brechtsanders opened this issue 2 weeks ago • 3 comments

I built c3c entirely from scratch on Windows using MinGW-w64+GCC (under the MSYS2 shell). But then, when I try to compile a simple C3 test using flags --cc gcc --linker=custom gcc I see the following issues:

  • the specified linker is not used (lld-link is used instead of gcc)
  • there are undefined symbols related to the standard libraries (maybe due to the above issue)
echo -e "import std::io;\nfn void main()\n{\nio::printn(\"Hello world!\");\n}" | 
 c3c compile - --cc gcc --linker=custom gcc
lld-link: error: <root>: undefined symbol: mainCRTStartup
lld-link: error: undefined symbol: _tls_index
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\collections\list.c3:370
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std_collections_list.std.os.backtrace.Backtrace.obj:(std_collections_list$std.os.backtrace.Backtrace$.List.ensure_capacity)
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\collections\list.c3:372
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std_collections_list.std.os.backtrace.Backtrace.obj:(std_collections_list$std.os.backtrace.Backtrace$.List.ensure_capacity)
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\exception.c3:138
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.exception_handler)
>>> referenced 22 more times

lld-link: error: undefined symbol: __security_cookie
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\exception.c3:134
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.exception_handler)
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\process.c3:182
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.resolve_backtrace)
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\io\formatter_private.c3:211
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.io.obj:(std.io.Formatter.floatformat)
>>> referenced 4 more times

lld-link: error: undefined symbol: __security_check_cookie
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\exception.c3:172
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.exception_handler)
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\exception.c3:174
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.exception_handler)
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\process.c3:190
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.resolve_backtrace)
>>> referenced 51 more times

lld-link: error: undefined symbol: SetUnhandledExceptionFilter
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\exception.c3:185
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.init_exception_handler)

lld-link: error: undefined symbol: memset
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\process.c3:170
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.symbolize_backtrace)
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\process.c3:184
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.resolve_backtrace)
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\process.c3:192
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.resolve_backtrace)
>>> referenced 13 more times

lld-link: error: undefined symbol: GetCurrentProcess
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\process.c3:172
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.symbolize_backtrace)

lld-link: error: undefined symbol: SymInitialize
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\process.c3:173
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.symbolize_backtrace)

lld-link: error: undefined symbol: SymCleanup
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\process.c3:174
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.symbolize_backtrace)

lld-link: error: undefined symbol: SymFromAddr
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\process.c3:188
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.resolve_backtrace)

lld-link: error: undefined symbol: SymGetModuleInfo64
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\process.c3:194
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.resolve_backtrace)

lld-link: error: undefined symbol: UnDecorateSymbolName
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\process.c3:200
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.resolve_backtrace)

lld-link: error: undefined symbol: SymGetLineFromAddr64
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\win32\process.c3:205
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.win32.obj:(std.os.win32.resolve_backtrace)

lld-link: error: undefined symbol: RtlCaptureStackBackTrace
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\os\backtrace.c3:81
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.os.backtrace.obj:(std.os.backtrace.capture_current)

lld-link: error: undefined symbol: _fltused
>>> referenced by R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.math.math_rt.obj
>>> referenced by R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.math.obj
>>> referenced by R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.io.obj

lld-link: error: undefined symbol: _get_errno
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\libc\libc.c3:44
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\libc.obj:(libc.errno)

lld-link: error: undefined symbol: _fseeki64
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\io\os\file_libc.c3:54
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.io.os.obj:(std.io.os.native_fseek)

lld-link: error: undefined symbol: _ftelli64
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\io\os\file_libc.c3:60
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.io.os.obj:(std.io.os.native_ftell)

lld-link: error: undefined symbol: fwrite
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\io\os\file_libc.c3:66
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.io.os.obj:(std.io.os.native_fwrite)

lld-link: error: undefined symbol: fputc
>>> referenced by C:\Prog\winlibs14.2.0msvcrt\custombuilt64\lib\c3\std\io\os\file_libc.c3:71
>>>               R:\winlibs14.2.0msvcrt64\_TMP_\c3c4331.tmp\obj\windows-x64\std.io.os.obj:(std.io.os.native_fputc)

lld-link: error: too many errors emitted, stopping now (use /errorlimit:0 to see all errors)
Failed to create an executable: (null)

brechtsanders avatar Dec 07 '25 08:12 brechtsanders

  1. Use the .py script to create the msvc_sdk folder.
  2. echo -e "import std::io;\nfn void main()\n{\nio::printn(\"Hello world!\");\n}" | c3c compile - should now work.

lerno avatar Dec 07 '25 22:12 lerno

When I run that it asks me:

Downloading MSVC v14.44.17.14 and Windows SDK v26100
Do you accept Visual Studio license at https://go.microsoft.com/fwlink/?LinkId=2179911 [Y/N]

I do not want MSVC on my system as I use MinGW-w64 + GCC instead.

So my question comes down to: how can c3c be told to use MinGW-w64 libraries instead of MSVC+WinSDK?

But maybe if it would use the linker I explicitly specify the right standard libraries may already be linked.

brechtsanders avatar Dec 08 '25 18:12 brechtsanders

I'm pretty sure --linker=custom doesn't work. Regardless, mingw support is rough but you can do it. Firstly, those linker errors are from undefined symbols for msvc stuff, you must add --target mingw-x64. Then you have to link it yourself, use c3c compile-only to get obj files, it should put them in ./obj/mingw-x64/. I would also use --single-module=yes so it spits out just a single object file, makes things easier. Then you can link with gcc. You need to link -ldbghelp for debug info. And if you want to use the String[] args version of main, I had to use -municode flag for some reason.

Super simple makefile:

main: main.c3
	c3c compile-only main.c3 --target mingw-x64 --single-module=yes
	gcc -o main ./obj/mingw-x64/main.obj -ldbghelp # -municode

If you want to use project.json include these in target info,

"target": "mingw-x64",
"type": "object-files",

It should spit out the obj files in .out/obj/mingw-x64/.

srkkov avatar Dec 09 '25 15:12 srkkov