【问题标题】:CMake: Can I wrap an ExternalProject in some object that I can just link to my target?CMake:我可以将 ExternalProject 包装在一些我可以链接到我的目标的对象中吗?
【发布时间】:2021-07-27 09:22:22
【问题描述】:

我将 this library 作为外部项目包括在内。根据文档,经过一些小的调整,我有这个:

# LIEF dependency
# ===========================
set(LIEF_PREFIX       "${CMAKE_CURRENT_BINARY_DIR}/LIEF")
set(LIEF_INSTALL_DIR  "${LIEF_PREFIX}")
set(LIEF_INCLUDE_DIRS "${LIEF_PREFIX}/include")

# LIEF static library
set(LIEF_LIBFILE
  "${LIEF_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}LIEF${CMAKE_STATIC_LIBRARY_SUFFIX}")

# URL of the LIEF repo (Can be your fork)
set(LIEF_GIT_URL "https://github.com/lief-project/LIEF.git")

# LIEF's version to be used (can be 'master')
set(LIEF_VERSION 0.11.5)

# LIEF compilation config
set(LIEF_CMAKE_ARGS
  -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
  -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
  -DLIEF_DOC=off
  -DLIEF_PYTHON_API=off
  -DLIEF_EXAMPLES=off
  -DLIEF_OAT=off
  -DLIEF_DEX=off
  -DLIEF_VDEX=off
  -DLIEF_ART=off
  -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
  -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
)

# Specify MSVCRT on MSVC
if(MSVC)
  list(APPEND ${LIEF_CMAKE_ARGS} -DLIEF_USE_CRT_RELEASE=MT)
  list(APPEND ${LIEF_CMAKE_ARGS} -DLIEF_USE_CRT_DEBUG=MTd)
endif()

# External project
ExternalProject_Add(LIEF_extproj
  PREFIX           "${LIEF_PREFIX}"
  GIT_REPOSITORY   ${LIEF_GIT_URL}
  GIT_TAG          ${LIEF_VERSION}
  INSTALL_DIR      ${LIEF_INSTALL_DIR}
  CMAKE_ARGS       ${LIEF_CMAKE_ARGS}
  BUILD_BYPRODUCTS ${LIEF_LIBFILE}
  UPDATE_COMMAND   ""
)

但是,原始文档仅包含目录并单独链接。我可以以某种方式将它们包装到一个目标中,如果我链接到该目标,我可以从该库中获取所有内容吗?

编辑: 我目前设置导入目标的尝试是这样的:

add_library(LIEF_depimpl STATIC IMPORTED)
set_target_properties(LIEF_depimpl PROPERTIES
  IMPORTED_LOCATION ${LIEF_LIBFILE}
  INTERFACE_INCLUDE_DIRECTORIES ${LIEF_INCLUDE_DIRS}
)
add_dependencies(LIEF_depimpl LIEF_extproj)

当我使用target_link_libraries() 将 LIEF 链接到我的项目时,CMake 生成成功,但生成的 makefile 中出现错误。

add_executable(testapp lief-test.cpp)
...
# Link the executable with LIEF
target_link_libraries(testapp PUBLIC ${LIEF_depimpl})

【问题讨论】:

  • 但是为什么不使用add_subdirectory呢?还是find_package(LIEF)
  • 我会使用 find_package,但我必须预编译库。 add_subdirectory 没有将我的项目与其依赖项分开。
  • 是的,您可以创建一个 IMPORTED 库目标,它可以累积外部项目的所有属性:库、包含目录等。不要忘记在该库目标和定义的目标之间add_dependencies对于 ExternalProject(在您的情况下为LIEF_extproj)。
  • @Tsyvarev 为了清楚起见,我已经编辑了这个问题。
  • "但是在生成的 makefile 中出现错误。"不是很具有描述性。此外,取消引用 ${LIEF_depimpl} 是引用名称为LIEF_depimpl目标 的错误方式。与目标链接的正确方法:target_link_libraries(testapp PUBLIC LIEF_depimpl).

标签: cmake dependencies external-project


【解决方案1】:

target_link_libraries() 的语法不是我想的那样。依赖变量不应该展开,像这样:

target_link_libraries(testapp PUBLIC LIEF_depimpl)

此外,如果 CMake 找不到外部项目的包含目录,它会抛出错误,因此您应该在 CMake 文件中创建该文件夹,如下所示:

set(LIEF_INCLUDE_DIRS "${LIEF_PREFIX}/include")
file(MAKE_DIRECTORY ${LIEF_INCLUDE_DIRS})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多