2016-10-03 23 views
0

我試圖編譯使用MinGW或TDM-GCC的Windows XP的w3m。在W3m patch - Linux from scratch應用補丁和添加-lws2_32在生成文件LIBS我所遇到的這些5和Windows的不相容的功能(在第一次出現的順序)Windows相當於kill,open_pipe_rw和fork - 試圖編譯w3m

bcopy (at Str.c) 
sleep (at file.c) 
kill (at image.c) 
open_pipe_rw (at image.c) 
fork (at image.c) 

我已經通過定義固定的前兩個後其視窗當量像:

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防止w3m.exe被調用這三個功能的Unix從在連接階段形成:

$ 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,以便使用這些函數的Windows等價物,那也沒關係。謝謝。

+0

kill或fork沒有1:1的等價物,這取決於如何使用這些調用。在fork的情況下,如果不重新設計程序,通常是不可能的。 (谷歌搜索open_file_rw表明它是第三方庫的一部分,而不是標準的Linux功能。) –

+0

感謝您的評論,這很有幫助。正如你所指出的那樣,在fork的情況下,事情有點棘手,我可能不得不努力調整程序,直到它們得到修復。我注意到了open_pipe_rw的情況,很少被使用。我也必須找到一種方法來調整這一點。 – Romario

+0

我在http://osdir.com/ml/web.w3m.devel/2006-01/msg00000.html找到了一個w3m的Windows補丁程序。當然,這是針對以前的w3m版本,但有趣的是它顯示瞭如何補丁fork和open_pipe_rw函數。在獲得這些信息後,我注意到使用這些Unix函數的唯一模塊是image.o,可能支持w3m中的圖像。然後我嘗試了配置中的--disable-image選項,並解決了這個問題。我得到了一個完美編譯和鏈接w3m.exe。 – Romario

回答

0

構建Cygwin的程序;然後將其與Cygnal的本機應用程序捆綁在一起,並將其與需要的Cygwin DLL組合在一起,但使用來自Cygnal的cygwin1.dll而不是Cygwin。

Cygwin有fork,kill和許多其他POSIX函數。

另外,Cygwin通過Windows控制檯API提供了雙向ANSI/VT100仿真。這意味着使用原始轉義序列與終端進行交互的程序將在cmd.exe控制檯窗口中直接運行—。 POSIX termios函數很適合設置字符一次輸入等等。

+0

謝謝你的回答,但是用Cygwin完成的任何編譯都不算作真正的Windows應用程序。目前,即使在Windows XP命令行上,使用TDM-GCC構建的補丁w3m也能完美工作。 – Romario

+0

Cygwin中的哪個問題在Cygnal中沒有得到糾正,或者沒有得到充分的解決,這使得應用程序不能算作真正的Windows應用程序?我想將該問題添加到列表中並對其進行處理。或者這是一些感性的東西? – Kaz

+0

TDM-GCC或MinGW是首選的方式,因爲無論何時可以使用MinGW構建一個軟件包,我比Cygwin更喜歡它,在w3m的情況下,我可以使用MinGW/TDM-GCC來構建它。話雖如此,我下次遇到類似問題時會嘗試Cygnal,因爲它看起來很有趣,很適合這項任務。請記住:在我瞭解Cygnal之前,我已經建立了w3m。順便說一句,我感謝你在TXR上的工作,因爲我對抓取任務感興趣。我也可以試試看。 – Romario