我有一个在linux上的应用程序,编译成功。我想在windows上运行同样的程序。
但是编译会产生以下与头文件相关的错误。
我该如何解决这个问题呢?
发布于 2009-06-01 06:51:02
Windows API在结构和风格上与任何风格的Unix提供的系统调用和库例程的混合非常不同。
termio.h
Windows使用与任何*nix系统非常不同的模型来执行终端I/O。因此,termios.h
头和它的朋友之间没有直接的等价物。
你想在MSDN上阅读有关Windows Communications Resources的信息。
需要更多了解的内容包括:
通常,您会发现需要直接处理更多的Windows API,因为在执行设备I/O时,stdio
会增加混乱。
select.h
没有与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进行移植
另一种方法是使用Cygwin进行移植。它在Windows API上提供了POSIX层的大部分。但是,除非您从Cygwin DLL购买商业使用许可,否则您最终会得到一个依赖于Cygwin DLL的应用程序。使用Cygwin获得一个适用于没有Unix经验的Windows用户的应用程序可能很棘手,因为关于这两个系统的设置和使用方式的许多其他假设是不同的。
Cygwin已经做了相当多的繁重工作来构建一个在Windows上工作的select()
实现,给出了不同的打开文件描述符的混合。这项工作就是described in the User's Guide。
请注意,只有在Cygwin环境中进行构建时,才会记录和支持针对Cygwin的构建。通常,仅仅将Cygwin的bin放在Windows路径上并从命令提示符运行是不够的。您确实需要启动Cygwin的bash构建,并从那里进行编译,以便所有内容都使用相同的Cygwin风格的挂载点和模拟的Unix文件结构。
将Cygwin头文件与第三方工具头文件混合使用肯定会让人抓狂。
编辑:我稍微重新整理了一下,并添加了一些回复评论的材料。
发布于 2021-09-20 07:19:08
还有一个用于Windows的termios移植,叫做termiWin。
Linux termiWin是一个库,它的目的是允许你在Window系统上使用,与在
中使用的代码相同,用于通过串口与设备通信。这是可能的,因为termios的函数已经被重写,以便与Windows的COM函数兼容。
发布于 2012-08-05 21:33:21
我使用在一些论坛中找到的代码创建了两个文件,以绕过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
和
"nowindowscomport.h“
/* 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
https://stackoverflow.com/questions/933745
复制相似问题