gpt4 book ai didi

windows - 使用 Windows SDK v7.1 从 Windows 7 上的源代码编译 OpenJDK 6

转载 作者:行者123 更新时间:2023-12-01 04:57:06 25 4
gpt4 key购买 nike

我正在尝试使用 Windows SDK v7.1 从 Windows 7 计算机上的源代码编译 OpenJDK 6。

经过一些调整后,我真的不知道该怎么做。

这是文件 - http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/tip/src/windows/native/sun/nio/ch/WindowsSelectorImpl.c

第 47 行和第 49 行:

   static int POLLIN   = 1;  // line 47
static int POLLCONN = 2;
static int POLLOUT = 4; // line 49

问题是包含的文件winsock2.h有以下代码:

#if(_WIN32_WINNT >= 0x0600)

/* Event flag definitions for WSAPoll(). */

#define POLLRDNORM 0x0100
#define POLLRDBAND 0x0200
#define POLLIN (POLLRDNORM | POLLRDBAND)
#define POLLPRI 0x0400

#define POLLWRNORM 0x0010
#define POLLOUT (POLLWRNORM)
#define POLLWRBAND 0x0020

#define POLLERR 0x0001
#define POLLHUP 0x0002
#define POLLNVAL 0x0004

typedef struct pollfd {

SOCKET fd;
SHORT events;
SHORT revents;

} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;

#endif // (_WIN32_WINNT >= 0x0600)

请注意,winsock2 如何#定义 POLLINPOLLOUT,而 WindowsSelectorImpl.c 将它们声明为 const。更糟糕的是,两者都给出不同的值:

OpenJDK:

POLLIN = 1
POLLOUT = 4

WinSock2(Windows SDK v7.1):

POLLIN = 0x300
POLLOUT = 0x10

显然,OpenJDK 代码不应该在 Windows 7 上编译。

但是,我确实想在 Windows 7 上编译它。

其中一个选项是安装较旧的 Windows SDK。另外就是改文件WindowsSelectorImpl.c,问题是怎么改?我的目的是重命名常量,但我不禁想知道 WinSock2 #defining 具有完全相同名称但不同值的常量...

有什么建议吗?

编辑1

再想一想,也许我最好有条件地使用 WinSock2 中的值?我的意思是值的变化可能意味着 API 的变化。

WinSock2.h 定义 pollfd 如下:

typedef struct pollfd {
SOCKET fd;
SHORT events;
SHORT revents;
} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;

与 WindowsSelectorImpl.c 对比:

typedef struct {
jint fd;
jshort events;
} pollfd;

前者与后者向后兼容(或多或少,不考虑对齐)。

因此,WinSock2 常量有可能是适合 Windows 7 的常量,但是如何处理 POLLCONN 呢?代码如何在 Windows 2003 或 XP 上运行?

编辑2

事情更糟,因为 C 实现在 java 中有一个匹配的对应项 - http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/tip/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java ,它使用与 C 代码相同的常量。

我不明白。 Windows 7 上的winsock2 是否会破坏为Windows 2003 SP1 上的winsock2 编写的任何代码?

编辑3

检查了 jdk7u 源( WindowsSelectorImpl.cAbstractPollArrayWrapper.java )。它使用重命名方法,这意味着即使 Windows SDK v7.1 使用不同的值声明 POLLIN 和 POLLOUT,jdk7 仍坚持 jdk6 的实现。

我真的不知道这是什么意思,但我不会比教皇更天主教。

最佳答案

解决方案很简单,但很烦人 - 获取 Visual Studio 2003 并使用它来编译 OpenJDK。最困难的部分是获得VS2003本身,其余的都很容易。

关于windows - 使用 Windows SDK v7.1 从 Windows 7 上的源代码编译 OpenJDK 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13924376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com