簡體   English   中英

為什么用C編寫的程序無法在Windows上運行?

[英]Why program in C won't work on Windows?

我有一個用C語言在Linux中編寫的程序,它在Linux平台上可以很好地工作,但是在Windows中卻不能工作。 它可以使用代碼塊(mingw32-gcc)在Windows中成功編譯,但無法按預期工作,它只會引發錯誤並殺死程序。 如何使它在Windows上運行,請幫忙。 這是代碼:

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int i, size, k = 2, ftab, sect = 3;

    char buf[512];
    char vbuf;
    int dev, fil_descr, off=0;

    fil_descr = open(argv[2], O_RDONLY);
    assert(fil_descr > 0);
    read(fil_descr, buf, 512);
    close(fil_descr);

    printf("Bootsector file: %s\n" ,argv[2]);

    dev=open(argv[1], O_RDWR);
    assert(dev > 0);
    write(dev, buf, 512);

    ftab = open("filetable", O_CREAT|O_RDWR);
    sprintf(buf, "{");
    write(ftab, buf, 1);

    for(i = 3; i < argc; i++)
    {   
        off = off + (k * 512);
        lseek(dev, off, SEEK_SET);
        fil_descr=open(argv[i], O_RDONLY);
        assert(fil_descr > 0);
        size = 0;       

        while((read(fil_descr, &vbuf, 1))!=0) 
        {
            size++;
            write(dev, &vbuf, 1);

        }

        k = (size > 512)?2:1;

        sprintf(buf, "%s-%d," ,argv[i], sect);
        write(ftab, buf, strlen(buf));
        printf("Input file \'%s\' written at offset %d\n", argv[i], off);
        close(fil_descr);

        sect = sect + k;
    }

    sprintf(buf,"}");
    write(ftab, buf, 1);

    lseek(ftab, 0, SEEK_SET);
    read(ftab, buf, 512);

    lseek(dev, 512, SEEK_SET);
    write(dev, buf, 512);   
    close (dev);
    close(ftab);    
}

不是 在Windows下不能運行C程序 (盡管C是使用的編程語言)。

沒想到的是,嘗試使用open Win32的編譯器使用POSIX API函數(例如openreadwrite )來編譯程序。 這包括使用此環境中不存在的多個標頭(如果存在這些標頭,則它們將聲明系統上不存在的函數)。

您將不得不使用Unix兼容性層(Microsoft曾經出售過該兼容性層,不確定是否仍然可以使用,Cygwin也可以工作),或者使用適當的C或使用本機Win32 API函數。

就是說,如果您切換到使用C標准庫I / O功能或本機Win32函數,它也可能無法按預期的方式工作。 輸出“ Bootsector: ”表明您正在嘗試某種根本無法在系統驅動器上運行的操作,並且僅適用於另一磁盤上的管理特權。

為了調試這樣的問題,您應該添加一些代碼行來幫助您進行調試。

我將程序的各個部分更改為

printf("Bootsector file: %s\n" ,argv[2]);
fil_descr = open(argv[2], O_RDONLY);
if (fil_descr < 0) {
    perror("open");
}

printf("fil_descr: %d\n", fil_descr);
assert(fil_descr > 0);

並意識到第二個命令行參數必須是要讀取的文件的文件名這一事實。

如果我正確指定它,它將正常工作。

正在寫入第一個文件,其余參數也是要讀取的文件名。

這兩個標頭都是特定於Linux的,

#include <sys/types.h>
#include <unistd.h>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM