我從2個不同的機器工作。一個是Windows,另一個是Linux。如果我交替地在同一個項目上工作,但在兩個操作系統之間切換,我最終是否會遇到編譯錯誤?我問,因爲也許有一個標準支持,而另一個不支持。在Windows和Linux中寫入C會導致編譯問題嗎?
回答
該問題相當廣泛,嚴格來說,取決於您的工具鏈。如果您要使用相同的工具鏈(例如GCC/MinGW或Clang),則可以最大限度地減少此類錯誤的機率。如果您要在Windows上使用Visual Studio,在Linux上使用GCC或Clang,則由於某些標頭不同,您可能會單獨遇到更多問題。所以一旦你的程序離開嚴格的ANSI C(C89)的領域,你就會自己做。
但是,如果您不小心,可能會遇到很多其他更褻瀆的錯誤,例如,如果您沒有告訴Windows端的編輯器使用這些錯誤,則Linux上的編譯器會扼殺行結尾。
啊,還要記住,如果你想實際交叉編譯,GCC可能是最好的選擇,因此我在回答中提到的第一部分成爲一個有爭議的問題。 GCC在兩端都是經過驗證的選擇。考慮到你的問題,你不太可能試圖編寫類似於內核模式驅動程序的東西 - 這會有根本的不同。
我在Eclipse中安裝了MinGW。我希望一切都按預期工作。 – drum 2013-02-11 02:39:47
這可能只有當您的應用程序使用某些特定的API。
直到您在各自的操作系統中重新編譯源代碼之後,它纔會產生問題。如果你想運行由windows(.exe或.obj)生成的編譯文件,進入linux或反之亦然,那麼它肯定會產生一個問題,並不會成爲可能。但是你可以將你的源代碼(擴展名爲.c/.C++的文件)移動到任何os中。有時候它也會產生不同頭文件的問題,所以請注意這一點。最佳做法是爲整個項目使用單個操作系統,避免多個操作系統,直到它非常必要。
什麼最佳實踐?對不起,我在各種平臺和體系結構(AIX,Solaris,BSD,Linux,Windows ... x86,PPC,SPARC ...)中維護着十幾個項目,如何保持一個最佳實踐系統?至少在開始的時候,你最終不得不做很多修補以解決一些問題,但隨着時間和經驗的增長,它會變得更加順暢。 – 0xC0000022L 2013-02-10 19:10:12
完全可以編寫適用於兩種平臺的代碼,無需編譯代碼。但是,這並非沒有一些困難。編譯器允許您在編譯器中使用非標準功能,並且通常很難做更多花哨的用戶界面(即使它仍然只是文本),因爲只要您開始想要做的不僅僅是「讀取一行文本進入一個殼「,它進入」非標準「的土地。
如果你發現自己需要做的比標準C庫能做的更多,請確保將代碼的這些部分分離成單獨的文件(或者一些文件,一個用於Linux/Unix風格的系統和一個用於Windows系統)。
使用相同的編譯器(gcc)將有助於避免「編譯器B無法編譯在編譯器A中正常工作的代碼」的問題。
但絕對不是絕對必要 - 只要確保在兩個平臺上編譯代碼,並且所有「支持」編譯器都足夠經常編譯代碼,以至於您沒有挖掘到很深的難以擺脫困境的代碼然後再發現「這不適用於其他系統」。如果您(至少)有一臺運行其他操作系統的虛擬機,它肯定會有所幫助,因此您可以輕鬆地嘗試這兩種變體。
理想情況下,您希望設置一個自動化系統,以便當您更改代碼[並且感覺這些更改是「完整的」]時,它會自動構建在您要使用的平臺和所有編譯器上。如果可能的話,也會自動測試!
我也會認真考慮使用版本控制 - 這樣,當某個或某個方面發生斷斷續續的事情時,您可以回頭查看代碼在停止工作之前的樣子,並且(希望)找到原因它比「嗯,我認爲這是我對foo.c所做的改變,讓我們拿出來......不,不是那個,好吧,改變如何...」 - 至少在版本控制方面,你可以說:「好的,所以1234版本不工作,讓我們試試版本1220 - 確定,這是可行的,現在嘗試1228,仍然有效 - 所以在1229和1234之間改變 - 嘗試1232,啊,它壞了...」編輯文件,你仍然可以去任何你喜歡的任何其他版本,很難。我已經使用了Mercurial很多,有點混亂,有些顛覆,並且在Perforce的一個項目上工作了幾年。所有這些都很好 - 我個人認爲我更喜歡水銀。
作爲一個副作用:大多數版本控制系統也以比手動方式處理文件名和行結尾的方式。
如果您將您的版本控制系統與「自動化構建和測試系統」(如Jenkins)結合使用,您可以使一切都變得非常自動化。 Jenkins是免費的,可以在Windows和Linux上運行,並且可以在您將代碼提交給版本控制系統時自動構建和測試代碼。
- 1. 在反編譯的代碼中導致問題導致問題
- 2. 在生產環境中編譯包。這會導致任何問題嗎?
- 3. 編碼問題,Windows和Linux
- 4. 在windows和linux上編譯
- 5. sublime text C++編譯會導致seg fault
- 6. 在linux和windows編譯Net :: SSLeay期間看到的問題
- 7. C#編譯問題:在1個語句換行導致錯誤
- 8. 能在Linux上編譯Windows代碼嗎?
- 9. 取消NSURLConnection會導致問題嗎?
- 10. 命名空間稱爲「異常」會導致編譯問題
- 11. 創建.mid文件:在Windows中寫入'\ n'會導致'\ r \ n'
- 12. WinHttp/Windows SDK的C++編譯問題
- 13. 如何在Linux和Solaris中編譯C?
- 14. 編譯C++代碼以在Windows和Linux中表現相同
- 15. 我在VS12中編寫代碼,它不會在Linux上編譯
- 16. a-b(= 100)會在C#中編譯嗎?
- 17. 在Linux中編譯C++
- 18. 在eclipse中編譯linux C++
- 19. 在Linux中編譯C++
- 20. AutoEventWireup =「true」會導致ASP.NET中的動態編譯嗎?
- 21. 下面的代碼會導致C++出現問題嗎?
- 22. 在Windows 10中編譯的問題
- 23. speak.js在Windows中編譯問題
- 24. cakephp Session->在linux中寫入問題
- 25. 在Windows和Linux上交叉編譯
- 26. 在Windows中的gcc無法編譯爲Unix/Linux編寫的C程序
- 27. C++中的decltype()導致編譯錯誤
- 28. 編譯問題C++
- 29. c + +編譯問題
- 30. C++編譯問題
您可能想在兩臺機器上使用GCC。 – 2013-02-10 19:02:35
你可以使用像GTk或Glib這樣的跨平臺庫。 – 2013-02-10 19:19:55