【发布时间】:2019-03-22 19:57:46
【问题描述】:
我有一个嵌入式 IoT 项目,我喜欢首先使用 VisualStudio 等 PC 工具进行部分开发。我的嵌入式项目只有一个用于文件系统的闪存,我想将fopenfread 等重定向到我自己在 Windows 上的私有实现。但我遇到的是无法让我的私有 CRT 库优先于内置 CRT(例如,由/MD 编译器开关驱动的内置行为)。
我有一个简单的三项目解决方案。
项目 1 是一个测试可执行文件。它有一条主线:
int main()
{
test();
}
项目 2 和 3 是静态库。项目 2:
#include <string.h>
#include <stdio.h>
void test()
{
printf("%s\n", strchr("x", 'x'));
}
项目 3 有:
char * strchr(const char * s, int c) // exact signature of MSVC
{
return "overridden";
}
我希望输出是 overridden 但实际上是
x
但如果我将这个添加到项目 1:
printf("%s\n", strchr("y", 'y'));
输出将是
overridden
overridden
第一个来自库中的test(),第二个来自可执行文件main()。
有什么建议吗?
【问题讨论】:
-
你试过什么不起作用?知道这将使任何人免于建议您已经尝试过的事情,或者使他们能够看到如果您的方法几乎是正确的,您可能会出错的地方。
-
我不确定“文件系统只有闪存”如何排除在测试系统上使用标准文件系统 I/O 的可能性——也就是说stdio 抽象的目的。更常见的要求是使用测试环境的文件系统模拟嵌入式非易失性持久存储 API。当然,除非您正在测试的是文件系统本身。
-
同意,它在嵌入式设备上使用特殊的 CRT,并且是使用 fopen 等的重点。但是嵌入式设备的开发工具低于标准。我喜欢拥有丰富的 PC 工具,例如很好的调试、代码覆盖率等,而这些都是嵌入式设备所不具备的。所以我需要做的是在 Windows 上模拟或模拟嵌入式 CRT,但是,它却落入了实际的 Windows CRT。
-
如果您在进行跨平台编译并想在 PC 上测试嵌入式程序,您肯定需要一些条件预处理器魔法。您基本上是在编写自己的 HAL,并且直接在文件中包含
<stdio.h> 意味着您正在跳过抽象层并直接进行实现。因此,首先创建您自己的用于进行必要接线的接头,并避免使用直接访问硬件的标准接头(如<stdio.h>)。很可能您也希望避免使用<stdlib.h>以及与malloc相关的任何内容。 -
@Groo 我能够重定向第三方库的 CRT,它是专有的并且不附带源代码。没有必要创建一个完整的抽象层。 (我会给你这个 - 链接解决方案并不漂亮。)
标签: windows visual-studio embedded msvcrt