i am making a compiler with rust, and compiling the code into c code. i want to compile the c code into machine code. my original plan was to find the current os, and what is the compiler it uses for c code. but i saw that there's crates that already do that for me. i tried using cc, but it compiles into a library, so there's no main and the program can't be compiled into an executable. so i came here to ask if there's any crates or ways to compile c code like with the crate cc, but to machine code.
Perhaps this might help. You'd have to invoke a linker yourself though.
that kind of ruins the point of cc. idk what kind of OS does the person compiling have, so i can't just call
ld main.o and pray it works. also, i tested it out, and cc does work fine if you just remove the "-c" line from the command running the code. idk how to remove that flag though
You can use
cc main.o -o main, right? That should work on any UNIX afaik and for windows you can invoke
the stated goal of the
cc crate is:
This library is intended to be used as a
The purpose of this crate is to provide the utility functions necessary to compile C code into a static archive which is then linked into a Rust crate.
Build type has APIs like
get_ranlib(), but there's no
get_compiler(), you can get the path of the compiler, I think you may be able to use the compiler as your linker, you just need to figure out what system libraries you need to link, and it depends on how you generated the C code. see:
another approach is not to detect the system C toolchain, but bundle your own compiler and linker,
zig is a good choice, and it also can do cross compiling. see also:
i cloned the git repo and saw that all i had to do was to remove the "-I" from the command running, and the code would work. to anyone who wants to replicate this, clone the cc repo, go to
src/lib.rs, find every instance of
cmd.arg("-I").arg(&**directory); and remove it. that alone would work, but there would still remain some extra things like a static link library and some extra compilation data
oh, i entirely missed this post. i already found an answer, but yours might be better. btw, i was not looking for the compiler, but for running the command
cc main.c. cc doesn't just compile your code into a linked library, it also checks every flag you send it and transfers it into into the right flag for the existing compiler.