2017-09-05 65 views
1

我想提供編譯爲項目一部分的所有外部庫,以便用戶不必下載任何內容。我正在使用CMake來管理項目。我遇到了SDL2的問題。它的包含文件對於不同的平臺是相同的,除了構建SDL2本身時生成的「SDL_config.h」,並且依賴於編譯器/平臺。在項目中爲Win和Linux提供SDL2頭文件

因此我需要提供兩個SDL_config.h文件 - 一個用於windows,一個用於linux。如果我也想自動生成過程中,我提出了兩個思路:

  1. 放入SDL頭文件的IFDEF _WIN32/UNIX條款,包括適當的SDL_config.h文件

  2. 保持SDL文件完好無損,並作出構建腳本會把正確SDL_config.h文件在include目錄

什麼是做我想要什麼的最優雅/通常的方式?

回答

1

把一個IFDEF _WIN32/UNIX子句中的SDL頭文件包含相應的SDL_config.h文件

修改庫文件這樣的問題不應該是一個選項,或至少它應該成爲你最後的資源。

保持SDL文件完好無損,並作出構建腳本會把正確SDL_config.h文件中您正在使用C進行包括目錄

。您不需要構建腳本。


創建一個目錄,並把那裏的兩個版本SDL_config.h。然後:

  • 如果你內心想要的複印過程中替換(無論路徑或)有變數,可能cmake的命令configure_file是你在找什麼:

    拷貝文件到另一個位置並修改其內容

  • 否則,如果所有你想要的是從到一個不同的位置上覆制一個文件,cmake的命令file在其要走的路籤名:

    COPY簽名將文件,目錄和符號鏈接複製到目標文件夾。

在這兩種情況下,你必須使用一個WIN32MSVCUNIXwhatelse如果您CMakeLists.txt/else語句。相當惱人的寫作和保持的確如此。


這就是說,你再次使用cmake。用它來結束。
您可以探索cmake模塊ExternalProject,而不是爲每個系統和編譯器的每個組合提供每個依賴項的編譯版本。通過使用它,您可以在cmake運行時下載和編譯即時依賴項。
這是迄今爲止更優雅的解決方案,它不要求用戶在他們的機器上手動安裝依賴關係。此外,維護更容易,並且根據您的CMakeLists.txt中的目標系統,您沒有任何醜陋的if/else。

+0

謝謝,正是我想到的。 – pseudomarvin

相關問題