printf不打印到控制台

时间:2020-04-07 03:29:20

标签: c printf windows-subsystem-for-linux

使用VS 2019创建在Windows子系统Linux(Ubuntu)中运行的C程序。 使用gcc starfire.c作为程序的原始目的进行编译是出于其他目的,但已陷入这种混乱状态。

void main() {
    printf("print this");
    return;
}

我尝试使用fflush(stdout)setbuf(stdout, NULL),但都没有用。请帮忙吗?

编辑:我也尝试过使用\n,所以也不是。我也在使用#include <stdio.h>,但它仍然拒绝正常工作。

1 个答案:

答案 0 :(得分:1)

对于Windows和Linux,x86 64位调用约定不同

请参阅:https://en.wikipedia.org/wiki/X86_calling_conventions特别是“ Microsoft x64调用约定”和“ System V AMD64 ABI”部分。

在Windows中,前四个参数在寄存器中传递。但是,在Linux下,第一个六个参数在寄存器中传递。

然后,哪个寄存器保存哪个参数[再次]不同:

            arg0    arg1    arg2    arg3    arg4    arg5
Windows:    RCX     RDX     R8      R9
Linux:      RDI     RSI     RDX     RCX     R8      R9

另外,哪些寄存器必须由被调用者保存,哪些寄存器可能被丢弃,等等。

在Windows(gcccygwin)下使用mingw将使用MS约定。在WSL下使用gcc将使用ubuntu / linux SysV ABI(即linux)约定。

因此,您不能只做交叉编译而没有某些选项来告诉编译器使用正确的调用约定。此外,动态库可能存在问题(在MS下为.dll,在Linux下为.so)。

此外,Windows使用PE(便携式可执行文件)格式[源自SysV COFF格式]。但是,Linux使用ELF对象/二进制可执行文件格式。

旁注: IIRC,MS刚刚决定在Linux下支持VS [但这是最近的],因此您可能会在这里得到一些缓解。

但是,IMO,我只使用gcc等。等在WSL / ubuntu / linux下。而且,如果您确实需要IDE,请尝试使用Eclipse。

您可以尝试让VS进行交叉构建,但是,IMO,墙上的标志是: 放弃希望所有进入此处的人


更新:

注意事项:我基于OP的原始帖子发布了以上内容([没有使用一些顶级注释的好处(例如gcc的使用方式))。但是,我思考得越多,它们的意义就越小。

但是,这引出了一个问题:您使用的是WSL还是WSL2?它们的实现方式不同。

使用WSL,MS刚刚向win10内核添加了额外的与Linux兼容的syscall接口支持。它可以执行有限数量的程序。 AFAIK,程序仍使用本机NTFS文件系统。您不是在运行Linux 内核,而只是在执行一些与Linux ABI兼容的可执行文件。

借助WSL2,MS实现了轻量级虚拟机[类似于vmwarevirtualbox],该虚拟机允许完整的ubuntu / linux内核运行。这样,您可以通过从“实时” ubuntu安装.iso(直接从ubuntu网站)启动VM来安装ubuntu。然后它会像本地的ubuntu安装一样安装[几乎]。

由于WSL2是VM,因此可以类似的方式安装fedorasusemint等。