My software has one main for normal use and a different one for unit tests. I would just love it if there was an option to gcc to specify which "main" function to use.
相关问题
- Multiple sockets for clients to connect to
- What is the best way to do a search in a large fil
- glDrawElements only draws half a quad
- Index of single bit in long integer (in C) [duplic
- Equivalent of std::pair in C
I'm assuming that you're using Make or something similar. I would create two files that contain different implementations of the main function, then in the makefile, define two separate targets that have identical dependencies on the rest of your files, except one uses your "unit test main" and the other your "normal main". Something like this:
As long as the "normal" target is closer to the top of the makefile, then typing "make" will choose it by default. You would have to type "make unittest" to build your test target.
Edit: Billy beat me to the answer, but here's a bit more background
More directly, main is usually more a function of the standard library. The thing that calls
main
isn't C, but rather the standard library. The OS loads the application, transfers control to the library's entry point (_start
in GCC), and the library ultimately callsmain
. This is why the entry point for a windows application can beWinMain
, and not the usual. Embedded programming can have the same sort of thing. If you don't have a standard library, you have to write the entry point that the library normally provides (among other things), and you can name it whatever you want.In the GCC toolchain, you can also replace the library's entry point with your own by using the
-e
option. (For that matter, you can also remove the library entirely.)Make your own:
If you don't like
ifdef
, then write two main modules that contain only main. Link one in for unit tests and the other in for normal use.Put them in separate files, and specify one .c file for normal use, and one .c file for testing.
Alternately,
#define
testing on the commandline using test builds and use something like:I had the same problem today: m1.c and m2.c both had a main function but needed to be linked and run one of them. Solution: user STRIP to remove the main symbol from one of them after compilation but before linking:
will run main from m2
will run main from m1
Without strip:
First of all, you can't have two functions named
main
in one compilation, so either the sources are in different files or you're using conditional compilation. Either way you've got to get two different .o files out. Therefore, you don't need a linker option; you just pass the .o file that you want in as an argument.If you don't like that, you can do fancy things with
dlopen()
to pullmain
from any object file you name dynamically. I can imagine circumstances where this might be useful—say, you take a systematic approach to unit tests, just put them all in a directory, and your code walks the directory, grabbing each object file, dynamically loading it, and running its tests. But to get started, something simpler is probably indicated.