[英]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.txt
到add_subdirectory
中的主要可執行文件打開並鏈接。
我的問題是board.c
(以及main.c
)取決於somelib
。 如何將此依賴項添加到子目錄CMakeLists.txt
? 有沒有辦法在不硬編碼somelib
路徑的情況下做到這一點? 我的感覺是我應該在somelib
中創建一個CMakeLists.txt
,如果我處理從根CMakeLists.txt
鏈接的庫,我覺得這會很容易,但我的困惑是board
與lib
相鄰。 我對 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.