[英]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函數(例如open
, read
和write
)來編譯程序。 這包括使用此環境中不存在的多個標頭(如果存在這些標頭,則它們將聲明系統上不存在的函數)。
您將不得不使用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.