我有一个静态C库,我可以用不同的编译时选项构建(例如_BUILD_SMALL,_BUILD_FAST).它有一个功能
void Foo(void);
Run Code Online (Sandbox Code Playgroud)
我想使用基准测试工具的单个实例来对库的"小"和"快"版本进行基准测试.我不想使用.dlls.
如何链接到"小"和"快"库以及别名函数名称,以便我可以调用小版本和快速版本.理想情况下,它看起来像:
void benchmark(void)
{
FAST_Foo();
SMALL_Foo();
}
Run Code Online (Sandbox Code Playgroud)
更多信息:
可以使用不同的优化选项-Os与-O3构建库.此外,算法略有不同(即缓存值与始终查找值).我想比较不同版本的大小与速度权衡.我希望单元测试和基准测试能够以最简单的方式在库的两个版本上运行.
这只是@Micha 给出的方法的一种变体?Górny(我的评论空间用完了)...
您可以创建以下格式的包含文件:
/* Automatically created file - do not edit or ugly dinosaur will eat you */
#ifndef PREFIX
# define RENAME(f)
#else
# define RENAME(f) PREFIX ## f
#endif
/* list all the function and variables you want to rename here in one place */
#define func_foo RENAME(func_foo)
#define func_bar RENAME(func_bar)
/* ... many more ... */
#undef RENAME
Run Code Online (Sandbox Code Playgroud)
至少gcc允许您使用选项从命令行指定头文件的包含-include rename.h(假设此文件名为rename.h)。因为您使用gcc相似选项(-O3和Os),所以我假设您gcc在本答案的其余部分中使用。否则,如果您的 C 编译器是合理的,您应该能够以某种类似的方式进行。
通过为 C 编译器提供不同的选项(此处通过CFLAGS设置),您可以轻松创建两个甚至三个版本的库,如果需要,可以同时链接这些版本:
CFLAGS += -include rename.h -DPREFIX=fast_ -D_BUILD_FAST -O3 -DBENCHMARKING
CFLAGS += -include rename.h -DPREFIX=small_ -D_BUILD_SMALL -Os -DBENCHMARKING
CFLAGS += -D_BUILD_FAST -O2
Run Code Online (Sandbox Code Playgroud)
如果您的库头文件看起来很规则,并且如果您声明了库私有函数static,那么很容易通过一些虚拟脚本使用非常简单的正则表达式从这些头文件中提取函数,以自动rename.h为您生成文件。如果您正在使用make或类似的东西,这是一个自然的构建目标。所有全局变量也需要使用相同的方法重命名以允许同时使用。
这个解决方案有三个要点:
| 归档时间: |
|
| 查看次数: |
7327 次 |
| 最近记录: |