gpt4 book ai didi

c++ - cmake 引用了以下导入的目标,但丢失了

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:01 25 4
gpt4 key购买 nike

我有一个包含两个库(liba 和 libb)的存储库,而 liba取决于 libb。它们是单个存储库的一部分,并且是使用单个 cmake“上下文”构建的。文件结构如下所示:

├── CMakeLists.txt
├── liba
│ ├── CMakeLists.txt
│ ├── internal
│ │ └── private.hh
│ ├── module.cc
│ ├── module.hh
└── libb
├── CMakeLists.txt
├── other.cc
└── other.hh

一切都编译和安装没有任何问题。虽然,如果我尝试创建一个依赖于 liba 的新项目。像这样:

cmake_minimum_required(VERSION 3.5)

find_package(Threads REQUIRED)
find_package(OpenCV REQUIRED)
find_package(liba REQUIRED)

add_executable(exec exec.cc)
target_link_libraries(exec PRIVATE is::liba)

我收到以下错误:

CMake Error at CMakeLists.txt:5 (find_package):
Found package configuration file:

/home/hodor/is-sdk/lib/cmake/liba/libaConfig.cmake

but it set liba_FOUND to FALSE so package "liba" is considered to be NOT
FOUND. Reason given by package:

The following imported targets are referenced, but are missing: is::libb

我在这里缺少什么? Repository link for context

生成 liba 的 CMakeLists:

cmake_minimum_required(VERSION 3.5)
include(GNUInstallDirs)

find_package(OpenCV REQUIRED core)
find_package(Threads REQUIRED)

list(APPEND liba_public_headers
"module.hh"
)

list(APPEND liba_private_headers
"internal/private.hh"
)

list(APPEND liba_sources
"module.cc"
${liba_public_headers}
${liba_private_headers}
)

add_library(liba ${liba_sources})

target_include_directories(
liba
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}> # for headers when building
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> # for generated files in build mode
$<INSTALL_INTERFACE:include/is/liba> # for clients in install mode
PRIVATE
${OpenCV_INCLUDE_DIRS}
)

target_link_libraries(liba
PRIVATE
is::libb
${OpenCV_LIBRARIES}
Threads::Threads
)

set_property(TARGET liba PROPERTY CXX_STANDARD 11)

install(
TARGETS liba EXPORT libaTargets
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
)

install(FILES ${liba_public_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/is/liba)

install(
EXPORT libaTargets
FILE libaConfig.cmake
NAMESPACE is::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/liba
)

生成 libb 的 CMakeLists:

cmake_minimum_required(VERSION 3.5)
include(GNUInstallDirs)

list(APPEND libb_public_headers
"other.hh"
)

list(APPEND libb_sources
"other.cc"
${libb_public_headers}
)

add_library(libb ${libb_sources})

target_include_directories(
libb
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}> # for headers when building
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> # for generated files in build mode
$<INSTALL_INTERFACE:include/is/libb> # for clients in install mode
)

install(
TARGETS libb EXPORT libbTargets
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
)

install(FILES ${libb_public_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/is/libb)

install(
EXPORT libbTargets
FILE libbConfig.cmake
NAMESPACE is::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libb
)

add_library(is::libb ALIAS libb)

包含 liba 和 libb 的顶级 CMakeLists:

cmake_minimum_required(VERSION 3.5)

add_subdirectory(liba)
add_subdirectory(libb)

最佳答案

看完C++Now 2017: Daniel Pfeifer “Effective CMake"我现在意识到我的配置中缺少什么。正如@Tsyvarev 所提到的,问题出在 libaConfig.cmake 上。

导出带有依赖项的库时,您应该导出 mylibraryTargets.cmake,如下所示:

install(
EXPORT libaTargets
FILE libaTargets.cmake
NAMESPACE is::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/liba
)

然后手动(在这里我不得不说有点失望)编写一个 mylibraryConfig.cmake 以及所有依赖项,如下所示:

include(CMakeFindDependencyMacro)

find_dependency(libb)
find_dependency(OpenCV)
find_dependency(Threads)

include("${CMAKE_CURRENT_LIST_DIR}/libaTargets.cmake")

关于c++ - cmake 引用了以下导入的目标,但丢失了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50061678/

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