CMake 打包已经存在的动态库生成 target
生活随笔
收集整理的這篇文章主要介紹了
CMake 打包已经存在的动态库生成 target
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一. 背景
在 CMakeLists.txt 中,某模塊 A 通過 add_subdirectory 引入模塊 B ,模塊 B 通過 add_subdirectory 引入模塊 C。模塊 C 里面本身就是一個開源的動態庫,比如 libtask。目的想要將 C 模塊打包成一個 Target ,以便在 A 模塊中中使用方便。
二. 舊版本實現和存在問題
A 模塊不直接使用 C 模塊,但是 A 模塊使用到了 B 模塊,B 模塊編譯依賴 C 模塊,就需要導致 A 編譯時要通過下面的方式引入 C 模塊
include_directories(${CMAKE_SOURCE_DIR}/thirdparty/B/thirdparty/C/include)link_directories(${CMAKE_SOURCE_DIR}/thirdparty/B/thirdparty/C/lib)
該使用方式 A 即為不友好。如果上層存在 M 模塊依賴 A 模塊,也要通過類似方式用 C,導致使用上極為不友好。
三.解決方案
在 CMake 中有 Target 的概念,嘗試單獨將 C 打包成一個 Target,這樣之后,當 A 依賴 B 時,B 依賴 C,A 不需要直接通過上面相對路徑的方式,因為 Target 已經被包進去了。于是在 C 模塊中,將所有的已經存在的 so 打包起來:
cmake_minimum_required (VERSION 3.10)project(libtask)file(WRITE ${PROJECT_BINARY_DIR}/empty.cpp "")
add_library (${PROJECT_NAME} SHARED ${PROJECT_BINARY_DIR}/empty.cpp)target_include_directories(${PROJECT_NAME} PUBLIC include)
target_link_libraries(${PROJECT_NAME} PUBLIC${CMAKE_CURRENT_SOURCE_DIR}/lib/libtask-a.so${CMAKE_CURRENT_SOURCE_DIR}/lib/libtask-b.so
)
在 B 模塊使用 A 模塊時,可以使用下面的方式
xxx
add_subdirectory(thirdparty/libtask)
xxx
target_link_libraries(${PROJECT_NAME} PRIVATE libtask)
其他有問題的方案:
在實現 C 時也可以通過 INTERFACE 的方式打包 C,使用下面的方式:
cmake_minimum_required (VERSION 3.10)project(libtask)add_library (${PROJECT_NAME} INTERFACE)target_include_directories(${PROJECT_NAME} INTERFACE include)
target_link_libraries(${PROJECT_NAME} INTERFACE${CMAKE_CURRENT_SOURCE_DIR}/lib/libtask-a.so${CMAKE_CURRENT_SOURCE_DIR}/lib/libtask-b.so
)
由于想要使用 INTERFACE 的方式打包庫文件,此時就就必須使用 INTERFACE 的方式包含頭文件和庫文件,這樣子就導致外部 A 模塊無法直接使用 C 的庫文件和頭文件,還要使用
xxx
add_subdirectory(thirdparty/libtask)
xxx
target_link_libraries(${PROJECT_NAME} PRIVATE libtask)
總結
以上是生活随笔為你收集整理的CMake 打包已经存在的动态库生成 target的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电视剧《雪花女神龙》的内容是?类似《雪花
- 下一篇: 空心砖多少钱啊?