我正在尝试使用MinGW或TDM-GCC为Windows XP编译w3m。在W3m patch - Linux from scratch应用补丁并在Makefile中将 -lws2_32 添加到LIBS后,我遇到了这5个与Windows不兼容的函数(按首次出现的顺序)
bcopy (at Str.c)
sleep (at file.c)
kill (at image.c)
open_pipe_rw (at image.c)
fork (at image.c)
我通过定义Windows等价物来修复前两个:
void bcopy(const void *from, void *to, size_t n) {
int *dummy;
dummy = memcpy(to, from, n);
}
#define sleep(n) Sleep(n*1000)
之后,所有目标文件都编译得很好但是从 image.o 调用的那三个Unix函数阻止了w3m.exe在链接阶段形成:
$ make
(cd libwc && make CC='gcc' OPTS='')
make[1]: Entering directory '/c/Documents and Settings/ibm/Downloads/w3m-0.5.3/libwc'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/c/Documents and Settings/ibm/Downloads/w3m-0.5.3/libwc'
gcc -I. -I. -g -O2 -I./libwc -IC:/msys32/usr/local/include -DHAVE_CONFIG_H -DAUXBIN_DIR=\"/usr/local/libexec/w3m\"
-DCGIBIN_DIR=\"/usr/local/libexec/w3m/cgi-bin\" -DHELP_DIR=\"/usr/local/share/w3m\" -DETC_DIR=\"/usr/local/etc\" -DCONF_DIR=\"/usr/local/etc/w3m\"
-DRC_DIR=\"~/.w3m\" -DLOCALEDIR=\"/usr/local/share/locale\"
-o w3m.exe main.o file.o buffer.o display.o etc.o search.o linein.o
table.o local.o form.o map.o frame.o rc.o menu.o mailcap.o image.o
symbol.o entity.o terms.o url.o ftp.o mimehead.o regex.o news.o func.o
cookie.o history.o backend.o keybind.o anchor.o parsetagx.o tagtable.o
istream.o version.o -lws2_32 -lpthread -L. -lindep -lgc -L./libwc -lwc
-LC:/msys32/usr/local/lib -lssl -lcrypto -lssl -lcrypto -lncurses
./libindep.a(indep.o): In function `bcopy':
C:\Documents and Settings\ibm\Downloads\w3m-0.5.3/indep.c:74: multiple definition of `bcopy'
./libindep.a(Str.o):C:\Documents and Settings\ibm\Downloads\w3m-0.5.3/Str.c:36: first defined here image.o: In function `closeImgdisplay':
C:\truncated\w3m-0.5.3/image.c:126: undefined reference to `kill'
image.o: In function `openImgdisplay':
C:\truncated\w3m-0.5.3/image.c:93: undefined reference to `open_pipe_rw'
image.o: In function `loadImage':
C:\truncated\w3m-0.5.3/image.c:354: undefined reference to `kill'
C:\truncated\w3m-0.5.3/image.c:383: undefined reference to `kill'
C:\truncated\w3m-0.5.3/image.c:436: undefined reference to `fork'
collect2.exe: error: ld returned 1 exit status
Makefile:130: recipe for target 'w3m.exe' failed
make: *** [w3m.exe] Error 1
如何定义这三种Unix功能的Windows等价物?如果您可以建议任何其他解决方案,例如为configure命令和/或Makefile提供特定选项或编辑它们,以便 image.c 使用Windows等效的那些函数,那也没关系。感谢。
答案 0 :(得分:0)
为Cygwin构建程序;然后使用Cygnal将其与所需的Cygwin DLL捆绑在一起,将其转换为本机应用程序,但使用来自Cygnal的cygwin1.dll
而不是Cygwin。
Cygwin有fork
,kill
和许多其他POSIX函数。
此外,Cygwin在Windows控制台API上提供双向ANSI / VT100仿真。这意味着使用原始转义序列与终端交互的程序可以在cmd.exe
控制台窗口之外工作。 POSIX termios
函数很适合设置一次一个字符的输入和所有这些。