簡體   English   中英

如何處理 CMake 中的子目錄依賴關系?

[英]How do I handle subdirectory dependencies in CMake?

我有一個項目需要在多個板上運行一個應用程序。 為此,我有兩個共享一個main.c的可執行文件,但使用不同的board.c編譯。 目錄樹如下:

CMakeLists.txt
src/
├─ board/
│  ├─ board_a/
│  │  ├─ board.c
|  |  ├─ CMakeLists.txt
│  ├─ board_b/
│  │  ├─ board.c
|  |  ├─ CMakeLists.txt
├─ app/
│  ├─ main.c
├─ lib/
│  ├─ somelib/
│  │  ├─ somelib.h
│  │  ├─ somelib.c

為了使根CMakeLists.txt更小且更易於維護,我為兩個板創建了一個CMakeLists.txt ,並希望將每個板編譯為 object 庫,用於根CMakeLists.txtadd_subdirectory中的主要可執行文件打開並鏈接。

我的問題是board.c (以及main.c )取決於somelib 如何將此依賴項添加到子目錄CMakeLists.txt 有沒有辦法在不硬編碼somelib路徑的情況下做到這一點? 我的感覺是我應該在somelib中創建一個CMakeLists.txt ,如果我處理從根CMakeLists.txt鏈接的庫,我覺得這會很容易,但我的困惑是boardlib相鄰。 我對 CMake 比較陌生,並且不確定如何最好地構建這些依賴項。

我的問題是board.c(以及main.c)依賴於somelib。 如何將此依賴項添加到子目錄 CMakeLists.txt? 有沒有一種方法可以在不硬編碼到 somelib 的路徑的情況下做到這一點? 我的感覺是我應該在 somelib 中創建一個 CMakeLists.txt,如果我處理從根 CMakeLists.txt 鏈接的庫,我覺得這會很容易,但我的困惑是板與 lib 相鄰。 我對 CMake 比較陌生,並且不確定如何最好地構建這些依賴項。

通過將每個board_<X>鏈接到somelib的目標,這是非常簡單的開始。

# in each board_<X>/CMakeLists.txt

add_library(board_<X> OBJECT ...)
target_link_libraries(board_<X> PUBLIC proj::somelib)

然后為somelib創建目標:

# src/lib/somelib/CMakeLists.txt

add_library(somelib somelib.c)
add_library(proj::somelib ALIAS somelib)

target_include_directories(
  somelib PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")

只要頂層 CMakeLists.txt 通過add_subdirectory包含這些子目錄(多個級別都可以),那么其他目標可以#include <somelib.h>和 CMake 將處理鏈接。

暫無
暫無

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

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