#cmake #dependencies #external-project
Вопрос:
Я включаю эту библиотеку в качестве внешнего проекта. Основываясь на документации, с некоторыми небольшими изменениями, у меня есть это:
# 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})
Комментарии:
1. Но почему бы не использовать
add_subdirectory
? Илиfind_package(LIEF)
?2. Я бы использовал find_package, но мне пришлось бы предварительно скомпилировать библиотеку. каталог add_sub не разделяет мой проект и его зависимости.
3. Да, вы можете создать ИМПОРТИРОВАННУЮ целевую библиотеку, которая может накапливать все свойства внешнего проекта: библиотеки, каталоги и т. Д. Не забудьте
add_dependencies
указать между этой целью библиотеки и целью, определенной для внешнего проекта (LIEF_extproj
в вашем случае).4. @Tsyvarev Я отредактировал вопрос для ясности.
5.«но затем я получаю ошибку в сгенерированном файле makefile». это не очень описательно. Кроме того, разыменование
${LIEF_depimpl}
-это неправильный способ ссылки на объект с именемLIEF_depimpl
. Правильный способ связи с целью:target_link_libraries(testapp PUBLIC LIEF_depimpl)
.
Ответ №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})