首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导出带有外部依赖项的cmake项目的既定方法是什么?

导出带有外部依赖项的cmake项目的既定方法是什么?
EN

Stack Overflow用户
提问于 2021-01-08 02:19:39
回答 1查看 294关注 0票数 1

我有一个项目,我正在与Cmake建设。它的目录结构如下:

代码语言:javascript
复制
Project
|
 CMakeLists.txt
 src
 |
  MyLib.h
 |
  MyLib.cpp
 |
  CMakeLists.txt
|
 third_party
 |
  abseil-cpp

由于abseil-cpp是使用Cmake构建的第三方依赖项,因此我将其作为一个子目录添加到我的顶级CMakeLists.txt中。src文件夹以类似的方式添加为我的顶级CMakeLists.txt中的一个子目录。类似于:

代码语言:javascript
复制
# 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文件类似于:

代码语言:javascript
复制
# 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的可传递依赖项?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-09 03:32:01

我建议不要将其添加为子目录,而是通过find_package安装和使用它。实现了对find_package的支持。

在您的CMakeLists.txt中:

代码语言:javascript
复制
find_package(absl REQUIRED)

target_link_library(MyLib PUBLIC absl::base absl::optional)

注意PUBLIC,它很重要。

然后使用包配置文件中的find_dependency宏定义依赖项。您所遵循的tutorial解释了如何做到这一点。

它应该看起来像这样:

代码语言:javascript
复制
@PACKAGE_INIT@

include(CMakeFindDependencyMacro)
find_dependency(absl REQUIRED)

include(${CMAKE_CURRENT_LIST_DIR}/MyLibTargets.cmake)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65617900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档