簡體   English   中英

創建帶有編譯時選項的庫

[英]Create a library with compile-time options

我正在用C ++創建游戲制作庫。 我使用SDL2 / OpenGL進行渲染。 我已經實現了大量的助手和非常基本的類,例如無單位角度,向量(實數,不是STL的動態數組),等等。

現在,我認為如果在編譯時定義宏允許使用ncurses而不是SDL,那將很酷。 唯一的問題是,雖然在.cpp文件中使用#ifdef USE_NCURSES對此非常理想,但在某些情況下,我也希望能夠在頭文件中使用此功能。

由於不編譯頭文件,因此最終用戶使用lib時將對頭中的任何#ifdef進行預處理,而不是編譯lib時。

我試圖找到一些解決方法,例如:

  • 使用類似configure的小腳本在編譯時生成一個附加頭
  • 找到一種預編譯頭的方法。 或多或少是我想要的,但是有太多的限制(相同的編譯器版本 ?真的?),並且無法確保使用預編譯的版本。
  • 創建某種標題模板語言,以及處理該語言的程序。 這太過分了。
  • 復制並粘貼整個項目,然后編輯副本,使其使用ncurses。 這聽起來像一個非常非常糟糕的主意。

我該怎么辦?

由於不編譯頭文件,因此最終用戶使用lib時將對頭中的任何#ifdef進行預處理,而不是編譯lib時。

我明白了您的意思,但是您的措詞方式可能會有誤解。 頭文件編譯,最終用戶與預處理器無關...但是的確,在生成lib二進制文件很長時間之后,頭文件的副本將被編譯,最終程序員將構建lib。進入他們的應用

但是,這是雙向的:標頭也被編譯到庫二進制文件中,並且這在最終程序員到達它附近的任何地方很長時間之前就發生了,所以要在您做出選擇之前很長時間。

根本沒有辦法部署預處理器來完成此任務。 但是,無需“復制並粘貼整個項目”。 任何明智的構建系統都可以根據構建設置推出項目的兩個變體

我會將您的庫拆分為單獨的模塊,並讓您的應用程序在運行時鏈接您想要的模塊(以及包含所有“公共” /基本邏輯的模塊)。

因此,您最終的程序員的build命令將類似於:

g++ theirApp.cpp -lyourLib-common -lyourLib-sdl

或類似:

g++ theirApp.cpp -lyourLib-common -lyourLib-ncurses

您可以使用封裝和職責分離的所有正常原則來使之正常工作。

暫無
暫無

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

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