Standard libraries not included when using MinGW-w64 GCC
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)
- Use the .py script to create the msvc_sdk folder.
echo -e "import std::io;\nfn void main()\n{\nio::printn(\"Hello world!\");\n}" | c3c compile -should now work.
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.
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/.