2017-04-06 174 views
0

是什麼在C進行實踐建立(不是一次),它使用同一個庫中的多個項目?據我所知,在CMake中,人們傾向於使用子目錄方法。但是,如果沒有庫源重複,庫不能成爲多個項目的真正子目錄。還有一個頂級的CMakeLists.txt方法,但是我不認爲這是一個好的解決方案,因爲你必須爲每個項目創建它,並且它必須是項目目錄的一個級別,它不能很好地與源代碼控制配合使用(比如GIT),您希望單個項目具有單個存儲庫/目錄。CMake的多個項目中使用相同的庫

回答

0

我居然在這裏找到可接受的解決方案: http://www.mail-archive.com/[email protected]/msg39062.html 這在某種程度上類似於add_subdirectory指定上一級目錄的想法,但不污染項目的CMakeLists.txt文件,而是通過CMake參數傳遞相關的項目路徑。這種方式項目的CMakeLists.txt文件似乎服從普通的CMake子目錄層次結構。我必須說,CMake以某種方式強迫我們使用子目錄層次結構感覺有點不對,但我不知道背後的所有原因,所以可能沒關係。

1

的CMake是一個跨平臺的make工具「使」,包括包含子項目的項目。因此,一個來源是否是這個結構的一部分。但恕我直言cmake不是管理一個主要項目樹中的所有項目的工具。

我的做法是建立獨立的項目。每個項目都會構建庫,測試,文檔並將其安裝到項目商店中。在其他庫或應用程序需要其中一個庫的情況下,它將在該項目的cmake文件中引用。

因此這些項目的版本是獨立的,項目是較小的,並且可以根據需要進行組合。

我使用腳本來建立我的所有庫的應用程序。但是這可以被cmake替換。

  • 取決於庫
  • 添加自定義命令到最頂級的項目,以觸發引用LIB的構建的構建讓最頂級項目的構建。

可能的解決辦法:

add_custom_command(TARGET myapp PRE_LINK 
        COMMAND cd /mypath/libA && mkdir build && cd build && cmake ../source && make install) 
add_custom_command(TARGET myapp PRE_LINK 
        COMMAND cd /mypath/libB && mkdir build && cd build && cmake ../source && make install) 
add_executable(myapp ${SOURCES}) 
+0

我同意你關於使用多個項目,這就是我的意思。 「每個項目都建立這個lib」 - 但是如果它沒有放在項目的子目錄中,它如何構建庫?我不能將同一個庫源放在多個項目中。它是一個不好的做法,通過以下add_subdirectory調用包含庫爲項目生成?:'add_subdirectory(「傻瓜」 CMake的「$ {} CMAKE_CURRENT_SOURCE_DIR /../ common_library」,「$ {} CMAKE_CURRENT_SOURCE_DIR /../ common_library /建「)' – jozols

+0

AFAIK不可能離開cmake樹(最後嘗試了一些版本之前)。但爲什麼不'cmake' +'make' +'make install'是基礎庫。然後在取決於的CMakeLists.txt中包含** find_library mylib **或** find_package mypackage **?你有沒有找到find_library? –

+0

我的項目使用了大量的庫,我希望一次性構建它們,而不是單獨構建它們,並自己考慮依賴關係。使用add_subdirectory的方法至少從一開始就起作用,但它感覺與CMake有點矛盾:)不知道你的意思是「你有沒有find_library out?」,如果我使用find_library進行構建,不需要使用find_library add_subdirectory。 – jozols

相關問題