【问题标题】:custom target as a target library in cmake自定义目标作为cmake中的目标库
【发布时间】:2015-07-07 16:41:21
【问题描述】:

我有一个自定义目标,它实际上是一个外部生成的库,我想将它集成到我的构建中。

add_custom_command(
       OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/liblib2.a
       COMMAND make -f ${CMAKE_CURRENT_SOURCE_DIR}/makefile liblib2.a)

add_custom_target(lib2  
       DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/liblib2.a)

我怎样才能告诉 cmake 这个目标实际上是一个库,在哪里可以找到它以及标题在哪里?

明确一点:我不希望使用这个库的上层 CMakeList 必须手动指定包含文件夹和库位置文件夹它必须自动完成(从目标属性)。 p>

在标准 cmake 库中,我只需在库 CMakeLists 中添加 INTERFACE_INCLUDE_DIRECTORIES 属性,以使 cmake 将我的应用与相关的 -I 和 -L gcc 参数链接:

set_target_properties(lib1
  PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES
  ${CMAKE_CURRENT_SOURCE_DIR})

但在自定义目标的情况下,我不知道该怎么做。

有什么线索吗?

感谢您的帮助。


感谢 zaufi 成功了!

对于其他可能对在 cmake 中嵌入外部构建目标感兴趣的人,这是我所做的:

cmake_minimum_required(VERSION 2.8)

SET(LIB_FILE ${CMAKE_CURRENT_SOURCE_DIR}/bin/liblib2.a)
SET(LIB_HEADER_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/include)

# how to build the result of the library
add_custom_command(OUTPUT  ${LIB_FILE}
                   COMMAND make 
                   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

# create a target out of the library compilation result
add_custom_target(lib2_target DEPENDS ${LIB_FILE})

# create an library target out of the library compilation result
add_library(lib2 STATIC IMPORTED GLOBAL)
add_dependencies(lib2 lib2_target)

# specify where the library is and where to find the headers
set_target_properties(lib2
    PROPERTIES
    IMPORTED_LOCATION ${LIB_FILE}
    INTERFACE_INCLUDE_DIRECTORIES ${LIB_HEADER_FOLDER})

现在在 CMakeLists.txt 中我可以做类似的事情

add_subdirectory(${ROOT_DIR}/lib1 bin/lib1)
add_subdirectory(${ROOT_DIR}/lib2 bin/lib2)
add_executable(app app.c )
target_link_libraries(app lib1 lib2)

无需指定 .a 和 .h 的位置。

【问题讨论】:

  • 非常感谢这个 nlko 和 zaufi,经过数小时试图弄清楚如何通过 cmake 从 nuget 获取库,您的技术就是解决方案
  • 在我的 cmake 安装中,set_target_properties 不起作用。 3 天后,我发现使用静态库(linux .a 文件)我必须使用 set_property 而不是 IMPORTED_LOCATION。
  • 这很棒,但我有一个小问题。我已经复制了你的 CMakeLists.txt,但每次我构建应用程序时,都会重新构建 liblib2.a。我已将DEPENDS 添加到add_custom_command 并让命令依赖于lib2 的makefile,但它没有按预期工作。任何想法如何解决这个问题?
  • 我明白了。我的问题是OUTPUT 指向带有CMAKE_CURRENT_BINARY_DIR 的东西,但我从未将输出从make 复制到该位置。我向add_ccustom_command 添加了第二个命令,类似于:COMMAND ${CMAKE_COMMAND} -E copy ${SOURCE_PATH}/liblib2.a ${CMAKE_CURRENT_BINARY_DIR}

标签: cmake


【解决方案1】:

您可以使用add_library() 并告诉它实际上是imported。然后,使用set_target_properties() 可以为其设置所需的INTERFACE_XXX 属性。之后,您可以像其他项目构建的其他对象一样将其用作序数目标。

【讨论】:

  • 太棒了,它有效,谢谢!我在问题的末尾添加了完整的实现。
  • 不可能“安装”这样一个库目标,因为 CMake 认为它是导入的。
【解决方案2】:

感谢您发布解决方案。我已将您的 sn-p 包装在一个函数中:

function(add_external_library)
    set(options)
    set(oneValueArgs TARGET WORKING_DIRECTORY OUTPUT COMMENT)
    set(multiValueArgs COMMAND INCLUDE_DIRS)
    cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" ${multiValueArgs}" ${ARGN})

    # Specify how to build the result of the library
    add_custom_command(OUTPUT "${ARGS_OUTPUT}"
        COMMAND ${ARGS_COMMAND}
        WORKING_DIRECTORY "${ARGS_WORKING_DIRECTORY}"
        COMMENT "${ARGS_COMMENT}")

    # Create a target out of the library compilation result
    add_custom_target(${ARGS_TARGET}_target DEPENDS ${ARGS_OUTPUT})

    # Create an library target out of the library compilation result
    add_library(${ARGS_TARGET} STATIC IMPORTED GLOBAL)
    add_dependencies(${ARGS_TARGET} ${ARGS_TARGET}_target)

    # Specify where the library is and where to find the headers
    set_target_properties(${ARGS_TARGET}
        PROPERTIES
        IMPORTED_LOCATION "${ARGS_OUTPUT}"
        INTERFACE_INCLUDE_DIRECTORIES "${ARGS_INCLUDE_DIRS}")
endfunction()

# Example
add_external_library(TARGET YourLib
    COMMAND           /bin/bash compile_your_lib.sh
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    OUTPUT            "output/yourlib.a"
    INCLUDE_DIRS      "include/a" "include/b"
    COMMENT           "Building YourLib")

add_executable(YourExe)
target_link_libraries(YourExe YourLib)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多