簡體   English   中英

在跨平台庫上工作

[英]Working on a cross platform library

在C ++中編寫跨平台庫的最佳實踐是什么?

我的開發環境是Linux上的Eclipse CDT,但是我的庫應該可以在Windows上進行原生編譯(例如從Visual C ++)。

謝謝。

在某種程度上,這將取決於您的圖書館要完成的目標。

例如,如果您正在開發GUI應用程序,那么您可能希望專注於使用經過良好測試的跨平台框架,例如wxWidgets

如果您的庫主要依賴於文件IO,那么您需要確保使用現有經過良好測試的跨平台文件系統抽象庫,例如Boost Filesystem

如果您的庫不屬於上述類型(即沒有現成的經過良好測試的跨平台框架供您使用),最好的辦法是確保盡可能遵守標准C ++(這意味着不要#include <linux.h><windows.h> )。 如果不可能(即您的庫從麥克風讀取原始聲音數據),您將需要確保給定平台的實現細節被充分抽象掉,以便最大限度地減少將庫移植到另一個庫所涉及的工作。平台。

據我所知,你可以做一些事情:

  1. 您可以將特定於平台的代碼划分為不同的命名空間。

  2. 您可以使用PIMPL慣用法隱藏特定於平台的代碼。

  3. 您可以使用宏確實知道要編譯的代碼(在這種情況下代碼將是特定於平台的)。 請查看此鏈接以獲取更多信息。

  4. 在多種環境中測試您的庫。

  5. 根據您正在做的事情,使用諸如Boost之類的庫可能會很好,因為它不是特定於平台的。 缺點(或可能是好的一面)是您將強制使用您包含的庫。

根據我的實踐經驗提出的幾點建議:

1)確保定期編譯目標平台中的源代碼。 不要等到最后。 這有助於盡早指出錯誤。 使用連續構建系統 - 它使生活更輕松。

2)切勿使用特定於平台的標頭。 甚至不用於編寫本機代碼 - 對於所有你知道的東西,在Windows標題中可能會期望一些字符串在XP中是ABC但在Win7中被改為ABC.12。

3)使用來自STL和BOOST的想法,然后在它們之上構建。 永遠不要認為這些是解決問題的靈丹妙葯 - STL很容易隨你的代碼一起提供,但BOOST不是。

4)不要使用像__STDCALL這樣的編譯器特定結構。 這是在尋求地獄。

5)在g ++和cl中使用類似的編譯器選項編譯時,相同的代碼可能會導致不同的行為。 請准備一份編譯器手冊。

無論何時我在這樣的事情上工作,我都會嘗試在我想要支持的不同環境中構建它。 同樣,如果您正在創建一個網頁,並且您想確保它在IE,Firefox和Chrome中有效,那么您將在所有這三種瀏覽器中對其進行測試。 在您想要支持的不同環境中進行測試,您將知道可以安全地說它適用的系統。

如上所述的問題有點抽象。但你可以考慮QT

這真的就像“不使用任何特定平台”一樣簡單。 如今可用的大量免費工具使得用C ++編寫跨平台代碼變得輕而易舉。 對於那些您確實需要使用平台特定API的罕見但偶然的情況,請確保通過#defines將它們分開,或者在我看來,更好地將每個平台的不同.cpp文件分開。

跨平台庫有很多替代方案,但我的個人偏好是:

  • GUI: Qt
  • 操作系統抽象(雖然Qt本身做得很好): 提升
  • 跨平台Makefile: CMake

最后一個,CMake,在過去的幾年里,對我來說是一個巨大的幫助,可以在Windows和Linux上進行雙重開發時保持構建環境的合理性。 它有一個相當陡峭的學習曲線,但一旦它啟動並運行,它的效果非常好。

您的意思是除了在目標平台上持續集成和測試之外 或者除了使用設計抽象出實現細節之外?

不,想不出什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM