我最近在做一個 C 專案,想學習如何正確使用 CMake。該專案由以下目錄結構組成(截至目前):
.
└── system
├── collections
│ ├── bin
│ ├── build
│ ├── includes
│ └── src
└── private
└── corelib
├── bin
├── build
├── includes
└── src
每個包含“bin”子目錄的目錄都是一個單獨的庫。它們每個都包含一個 CMakeLists.txt。
計劃是以這樣的方式鏈接庫,在開發程序中,不需要手動重新編譯“corelib”來接收更新的代碼,同時還確保一旦所有庫都被編譯為共享庫和放在諸如“usr/local/lib”或類似的地方。
我在庫“集合”中有庫“corelib”的依賴項。為了解決上述依賴關系,我在“集合”中提出了以下 CMakeLists.txt:
cmake_minimum_required(VERSION 3.0.0)
project(collections VERSION 0.1.0 LANGUAGES C)
set(LIBRARY_OUTPUT_PATH ../bin)
add_subdirectory(../private/corelib ${LIBRARY_OUTPUT_PATH})
include_directories(./includes)
aux_source_directory(./src SOURCES)
add_library(collections SHARED ${SOURCES} main.c)
但是,這不會產生我正在尋找的結果,因為我在構建時得到以下輸出:
[main] Building folder: collections
[build] Starting build
[proc] Executing command: /usr/bin/cmake --build /home/codeuntu/Repositories/netcore-c/src/system/collections/build --config Debug --target all -j 6 --
[build] gmake[1]: *** No rule to make target '../bin/all', needed by 'all'. Stop.
[build] gmake[1]: *** Waiting for unfinished jobs....
[build] Consolidate compiler generated dependencies of target collections
[build] [ 50%] Built target collections
[build] gmake: *** [Makefile:91: all] Error 2
[build] Build finished with exit code 2
看來這是錯誤的做法。任何幫助是極大的贊賞。
這是“corelib”的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.0.0)
project(corelib VERSION 0.1.0 LANGUAGES C)
include_directories(./includes)
aux_source_directory(./src SOURCES)
set(LIBRARY_OUTPUT_PATH ../bin)
add_library(corelib SHARED ${SOURCES} main.c)
uj5u.com熱心網友回復:
二進制目錄必須是當前目錄的子目錄,不能在上面../bin。采用:
add_subdirectory(../private/corelib some_unique_name)
總的來說,讓我們解決一些問題。更高級的 CMake 可能如下所示:
# system/CmakeLists.txt
add_subdirectory(private EXCLUDE_FROM_ALL)
add_subdirectory(collections)
# system/collections/CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(collections VERSION 0.1.0 LANGUAGES C)
file(GLOB_RECURSE srcs *.c *.h)
add_library(collections ${srcs})
# Use only target_* intefaces
target_include_directories(collections PUBLIC
./includes
)
target_link_libraries(collections PRIVATE
corelib
)
# system/private/CMakeLists.txt
add_subdirectory(corelib)
# system/private/corelib/CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(corelib VERSION 0.1.0 LANGUAGES C)
file(GLOB_RECURSE srcs *.c *.h)
add_library(corelib ${srcs})
target_include_directorieS(corelib PUBLIC ./includes)
# system/CMakePresets.json
{
... see documentation ...
"configurePresets": [
{
...
"cacheVariables": {
"BUILD_SHARED_LIBS": "1",
"ARCHIVE_OUTPUT_DIRECTORY": "${binaryDir}/bin",
"LIBRARY_OUTPUT_DIRECTORY": "${binaryDir}/bin",
"RUNTIME_OUTPUT_DIRECTORY": "${binaryDir}/bin"
}
}
也就是說,總的來說,我不認為里面的每個專案system都想編譯他自己的單獨實體corelib,而是corelib應該共享一個。只需corelib從任何地方添加一次。請注意,它不必按順序排列 - 您可以target_link_libraries在定義目標之前對其進行操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473149.html
下一篇:C語言中的“物件”是什么?
