我在linux中有一个应用程序,它已成功编译。 我想在Windows中运行相同的程序。
但编译会产生以下与头文件相关的错误。
我该如何解决这个问题?
答案 0 :(得分:33)
Windows API在结构和风格上与任何Unix风格提供的系统调用和库例程的混合非常不同。
Windows使用与任何* nix系统完全不同的模型进行终端I / O.因此,确实没有直接等同于termios.h
标题及其朋友。
您想在MSDN上阅读有关Windows Communications Resources。
的信息要了解更多信息,请参阅:
BuildCommDCB()
SetCommState()
一般情况下,您会发现需要直接处理Windows API,因为stdio
会在进行设备I / O时增加混乱。
没有直接相当于Unix select(2)系统调用。
在Windows中,许多内核对象可以处于信号状态或非信号状态,并且发信号通知对象的行为可用于释放调用WaitForMultipleObjects()
的线程。当数据可用时,会发出一些但不是所有HANDLE
个对象的信号。具体来说,我知道来自WinSock的HANDLE
具有该功能,但我不了解Comm API。我知道打开文件的HANDLE
不会。
如果您需要等待处理窗口消息的线程中的事件,那么您应该使用MsgWaitForMultipleObjects()
代替,因为它会在线程被阻止时正确传递消息。
在MSDN文章Using Synchronization上了解Windows同步原语。
但是,Windows中内置了几种异步I / O,可以通过更改设计来取代select()
的需要。两者都需要广泛使用不能与C stdio库结合使用的功能。
MSDN有几篇关于I / O技术的文章,以及大量的例子:
CreateFile()
(特别是备注部分)请注意,有关Windows如何工作的大部分信息都分散在概述文章和API函数和结构的参考资料的备注部分中。这可以给人的印象是,在第一次阅读时没有任何内容完整记录。
另一种方法是使用Cygwin来执行端口。它通过Windows API提供大多数POSIX层。但是,除非您从他们那里购买商业使用许可,否则您最终会得到一个依赖于Gg的Cygwin DLL的应用程序。使用Cygwin来获得一个适用于没有Unix经验的Windows用户的应用程序可能会很棘手,因为关于这两个系统的设置和使用方式的许多其他假设不同。
Cygwin已经做了相当多的繁重工作来构建select()
的实现,该实现在Windows上可以使用不同的打开文件描述符。这项工作是described in the User's Guide。
请注意,只有在Cygwin环境中完成对Cygwin的构建才会被记录和支持。将Cygwin的bin放在Windows PATH上并从命令提示符下工作通常是不够的。你真的需要启动Cygwin的bash构建并从那里编译,以便所有东西都使用相同的Cygwin样式挂载点和模拟的Unix文件结构。
将Cygwin头文件与第三方工具头文件混合是疯狂的必然途径。
编辑:我重新安排了一下,并添加了一些材料以回应评论。
答案 1 :(得分:-2)
我使用在某些论坛中找到的代码创建了2个文件来绕过windows.h和windows com端口库:
" nowindows.h"
/* file nowindows.h v1.0 use at your own risk *
#ifndef DWORD
#define WINAPI
typedef unsigned long DWORD;
typedef short WCHAR;
typedef void * HANDLE;
#define MAX_PATH PATH_MAX
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int BOOL;
#include <sys/types.h>
#include <sys/stat.h>
#include "unistd.h"
#include <fcntl.h>
#define GENERIC_READ O_RDONLY //read only mode
#define GENERIC_WRITE O_WRONLY //write only mode
#define CREATE_ALWAYS O_CREAT //create new file
#define OPEN_EXISTING 0 //fake parameter's value
#define FILE_ATTRIBUTE_NORMAL 0644 // file attributes
#endif
和
&#34; nowindowscomport.h&#34;
/* file nowindowscomport.h v1.0 use at your own risk *//
typedef struct _DCB {
DWORD DCBlength;
DWORD BaudRate;
DWORD fBinary :1;
DWORD fParity :1;
DWORD fOutxCtsFlow :1;
DWORD fOutxDsrFlow :1;
DWORD fDtrControl :2;
DWORD fDsrSensitivity :1;
DWORD fTXContinueOnXoff :1;
DWORD fOutX :1;
DWORD fInX :1;
DWORD fErrorChar :1;
DWORD fNull :1;
DWORD fRtsControl :2;
DWORD fAbortOnError :1;
DWORD fDummy2 :17;
WORD wReserved;
WORD XonLim;
WORD XoffLim;
BYTE ByteSize;
BYTE Parity;
BYTE StopBits;
char XonChar;
char XoffChar;
char ErrorChar;
char EofChar;
char EvtChar;
WORD wReserved1;
} DCB, *LPDCB;
typedef struct _COMSTAT {
DWORD fCtsHold :1;
DWORD fDsrHold :1;
DWORD fRlsdHold :1;
DWORD fXoffHold :1;
DWORD fXoffSent :1;
DWORD fEof :1;
DWORD fTxim :1;
DWORD fReserved :25;
DWORD cbInQue;
DWORD cbOutQue;
} COMSTAT, *LPCOMSTAT;
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS, *LPCOMMTIMEOUTS;
#define ERROR_INVALID_HANDLE 6L
/* Purge functions for Comm Port */
#define PURGE_TXABORT 0x0001 /* Kill pending/current @@-377,11 +382,4 @@ */
#define PURGE_RXCLEAR 0x0008
#define PURGE_TXCLEAR 0x0004
#define PURGE_RXABORT 0x0002
// DTR Control Flow Values.
#define DTR_CONTROL_DISABLE 0x00
#define DTR_CONTROL_ENABLE 0x01
#define DTR_CONTROL_HANDSHAKE 0x02
#define RTS_CONTROL_DISABLE 0x00
#define NOPARITY 0
#define ONESTOPBIT 0