gpt4 book ai didi

CMake:导入的库作为另一个自定义命令或目标的 OUTPUT 或 BYPRODUCTS

转载 作者:行者123 更新时间:2023-12-01 10:05:38 25 4
gpt4 key购买 nike

我想从 ZIP 文件中提取一个静态库并链接到它。

具有以下设置:

add_library(COMSDK_LIB STATIC IMPORTED GLOBAL)
set_property(TARGET COMSDK_LIB PROPERTY IMPORTED_LOCATION "/tmp/lib/libRTSClientSdk.a")

并且导入的库正在另一个 CMakeLists.txt 中使用:
target_link_libraries(mylib COMSDK_LIB)

导入的库会不会是另一个 add_custom_command生成的?或 add_custom_target ?

我尝试了以下,但它确实 不是 工作:
add_custom_command(
OUTPUT "/tmp/lib/libRTSClientSdk.a"
COMMAND unzip -x client_sdk.zip -o /tmp
DEPENDS client_sdk.zip
)

给定的错误消息是:
$ ninja
ninja: error: '/tmp/lib/libRTSClientSdk.a', needed by 'mylib.dll', missing and no known rule to make it

最佳答案

问题是您的自定义命令在 make 期间正在执行。步骤,并且它期望更早提取依赖项 --- 在 cmake 期间执行。因此,基本上,您需要从 SDK 获取该静态库。之前 您在 CMake 规则中或在链接本身期间使用它。

CMake mailing list 中列出了两种可能的解决方案.

解决方案#1 :(在 CMake 端执行)

重新表述其中一个代码片段,下载和解压缩是在 CMake 执行期间完成的:

set(CLIENTSDK_ZIP "cliendsdk.zip")
set(CLIENTSDK_URL "http://example.com/${CLIENTSDK_ZIP}")
set(CLIENTSDK_LIB "libRTSClientSdk.a")
set(CLIENTSDK_OUTPUT_DIR "/tmp/sdk/dir")

# Basically just downloading zip file:
message(STATUS "Downloading ${CLIENTSDK_URL}")
execute_process(COMMAND wget ${CLIENTSDK_URL}
WORKING_DIRECTORY ${CLIENTSDK_OUTPUT_DIR}
RESULT_VARIABLE errno
ERROR_VARIABLE err)

if (NOT ${errno} EQUAL 0)
message(ERROR "Failed downloading ${CLIENTSDK_URL}. Code: ${err}")
endif()

# Extracting downloaded zip file:
message(STATUS "Extracting ${CLIENTSDK_ZIP})
execute_process(COMMAND unzip ${CLIENTSDK_ZIP}
WORKING_DIRECTORY ${CLIENTSDK_OUTPUT_DIR}
RESULT_VARIABLE errno
ERROR_VARIABLE err)

if (NOT ${errno} EQUAL 0)
message(ERROR "Failed extracting ${CLIENTSDK_ZIP}. Code: ${err}")
endif()

# Importing into CMake scope one library from extracted zip:
add_library(specific_sdk_lib STATIC IMPORTED)
set_target_properties(specific_sdk_lib
PROPERTIES IMPORTED_LOCATION ${CLIENTSDK_OUTPUT_DIR}/lib/${CLIENTSDK_LIB})

# Adding rule for linking to specific static library from extracted zip:
target_link_libraries(mylib specific_sdk_lib)

解决方案#2 (在make端执行):
# We must include ExternalProject CMake module first!
include("ExternalProject")

set(CLIENTSDK_URL "http://example.com/clientsdk.zip")
set(CLIENTSDK_LIB "libRTSClientSdk.a")
set(CLIENTSDK_PREFIX "3rd_party")
set(CLIENTSDK_EXTRACTED_DIR
"${CMAKE_CURRENT_BINARY_DIR}/${CLIENTSDK_PREFIX}/src/DownloadClientSDK/")

ExternalProject_Add("DownloadClientSDK"
PREFIX ${CLIENTSDK_PREFIX}
URL "${CLIENTSDK_URL}"
# Suppress ExternalProject configure/build/install targets:
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND "")

add_library(COMSDK_LIB STATIC IMPORTED)
set_target_properties(COMSDK_LIB PROPERTIES IMPORTED_LOCATION
${CLIENTSDK_EXTRACTED_DIR}/${CLIENTSDK_LIB})

# Require all that download/unzip mumbojumbo only for COMSDK_LIB:
add_dependencies(COMSDK_LIB DownloadClientSDK)

target_link_libraries(my_library COMSDK_LIB)

基本上, CMake它是 ExternalProject模块负责(生成正确的 make 目标)识别存档格式、解压缩,以及如果需要 - 配置、构建和安装。

关于CMake:导入的库作为另一个自定义命令或目标的 OUTPUT 或 BYPRODUCTS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34438994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com