我有一个项目,我正在与Cmake建设。它的目录结构如下:
Project
|
CMakeLists.txt
src
|
MyLib.h
|
MyLib.cpp
|
CMakeLists.txt
|
third_party
|
abseil-cpp由于abseil-cpp是使用Cmake构建的第三方依赖项,因此我将其作为一个子目录添加到我的顶级CMakeLists.txt中。src文件夹以类似的方式添加为我的顶级CMakeLists.txt中的一个子目录。类似于:
# Contents of Project/CMakeLists.txt
# Usual CMake boiler plate here.
add_subdirectory(third_party/abseil-cpp)
add_subdirectory(src)我的src文件夹CMakeLists.txt创建了一个依赖于abseil-cpp创建的库目标之一的库。这种依赖关系是用target_link_library表示的。我在src目录中的CMakeLists.txt文件类似于:
# Contents of Project/src/CMakeLists.txt
add_library(MyLib STATIC
MyLib.cpp
MyLib.h)
target_link_library(MyLib absl::base absl::optional)我在关注Cmake tutorial,看看如何将我的项目导出为其他Cmake项目可以导入的Cmake项目,并将MyLib (及其依赖项)作为其项目中的Cmake目标。该教程很清楚地说明了如何实现这一点,并通过install创建了CMake文件,其他Cmake项目可以通过find_package()导入这些文件。
只要我为MyLib创建的导出集中也添加了MyLib的每个依赖项,这就非常有效。然而,由于abseil库是由我不想接触的CMakeLists.txt文件构建在另一个子目录中,所以我不清楚如何将依赖项的可传递列表与MyLib一起导出。在absl::base的情况下,我尝试导出abseil_base (absl::base是abseil_base的别名),但Cmake抱怨我无法导出不是在我试图从中导出它的目录中构建的目标。有没有一种既定的方法可以将我的库导出为Cmake目标,并带有可传递的外部依赖项集(如abseil库),以便导入的Cmake项目可以添加具有简单target_link_library(external_executable MyLib::MyLib)或类似内容的依赖项,并且还可以拉出MyLib的可传递依赖项?
发布于 2021-01-09 03:32:01
我建议不要将其添加为子目录,而是通过find_package安装和使用它。实现了对find_package的支持。
在您的CMakeLists.txt中:
find_package(absl REQUIRED)
target_link_library(MyLib PUBLIC absl::base absl::optional)注意PUBLIC,它很重要。
然后使用包配置文件中的find_dependency宏定义依赖项。您所遵循的tutorial解释了如何做到这一点。
它应该看起来像这样:
@PACKAGE_INIT@
include(CMakeFindDependencyMacro)
find_dependency(absl REQUIRED)
include(${CMAKE_CURRENT_LIST_DIR}/MyLibTargets.cmake)https://stackoverflow.com/questions/65617900
复制相似问题