我目前正在Windows平台下编写一个简单的C运行时,以更好地了解编译器/链接器的工作原理。
演示项目在这里:MarsCRT
我目前正在研究
strlen()
。这个函数看起来像这样:
// file: MarsString.c
size_t strlen(char* Char)
{
size_t Length = 0;
for(;Char[Length]; Length ++);
return Length;
}
但是当我编译项目时
cl /c /GS- ./src/MarsEntry.c ./src/MarsIO.c ./src/MarsMalloc.c ./src/MarsPrintf.c ./src/MarsString.c
...plenty of warnings...
C:\Users\z\Project\Github\dev\marscrt\src\MarsCRT.h(41): error C2371: 'strlen': redefinition; different basic types
C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt\string.h(215): note: see declaration of 'strlen'
...
看来我没有正确摆脱默认的ucrt。 我检查了
cl.exe /help
,但没有找到我期望的答案。
所以我想知道如何在没有ucrt的情况下编译项目?
我尝试在 cl.exe 中添加
/X
作为标志,但该项目甚至找不到 <Windows.h>
。我还尝试了 /MD
和 /MT
编译器标志,但它们都没有按我的预期工作。
其实我可以添加像
mars_strlen()
这样的前缀来绕过ucrt重新定义,但这不是我想要的。
这是指南:
基本上,您需要将附加标志传递给编译器。在 MSDN 上搜索 /nodefaultlib 等内容。
PS: 抱歉,未来的读者先生,链接已损坏。