日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

CMake 打包已经存在的动态库生成 target

發布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。