I have a static C library that I can build with different compile time options (e.g. _BUILD_SMALL, _BUILD_FAST). It has a function
void Foo(void);
I would like to use a single instance of a benchmarking tool to benchmark the “small” and the “fast” versions of the library. I don’t want to use .dlls.
How can I link to the “small” and the “fast” libraries and alias the function names so I can call the small version and the fast version. Ideally it would look something like:
void benchmark(void)
{
FAST_Foo();
SMALL_Foo();
}
More information:
The library can be built with different optimizations options -Os versus -O3. Also, the algorithms vary slightly (i.e. cached values vs looking up values always). I want to compare the size vs speed tradeoffs of the different versions. I’d like the unit tests and benchmarking to be ran on both versions of the library the easiest way possible.
This is just a variation of the method as given by @Michał Górny (I run out of comment space there)…
You could create an include file of the following form:
At least
gccallows you to specify the inclusion of a header file from command line with option-include rename.h(assuming this file is calledrename.h). Because you usegcclookalike options (-O3andOs), I am assuming you usegccin the rest of this answer. Otherwise, if your C compiler is reasonable, you should be able to do it in some similar way.You can create easily two or even three versions of your library that can be linked in at the same time if you want, by providing different options for your C compiler (here through
CFLAGSsetting):If your library header files look very regular and if you declare the library private functions
static, then it is easy to extract the functions from those header files by some dummy script using very simple regular expressions to automatically generate therename.hfile for you. This is a natural build target if you are usingmakeor something similar. All the global variables also need to be renamed using the same method to allow simultaneous use.There are three main points with this solution: