【问题标题】:How to build a static library from two directories?如何从两个目录构建静态库?
【发布时间】:2022-01-21 23:15:54
【问题描述】:

我有两个文件夹,里面有两个不同的库。

  • LibBase
  • LibPublic

LibB 包含一些 LibBase 的标头。

我希望将 LibPublic 作为静态库,在其 .a 文件中包含“LibBase”。

  • 每个 CMakeLists.txt 是:
set(SRCLIB file.cpp)
add_library(${PROJECT_NAME} ${SRCLIB})
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
target_include_directories(...)
  • 顶层 CMakeLists.txt:
add_subdirectory(LibBase)
add_subdirectory(LibPublic)

如何强制 CMake 将 LibBase 包含在 LibPublic 中,以便我只能共享 libLibPublic.a

LibBase 是专有库,LibPublic 是我们共享的“公共”库。

LibBase 和 LibPublic,两者都可以由其他库或应用程序使用 add_subdirectory() 添加,以便可以提供单个应用程序可执行文件或单个 .a 文件。每个“库”都应该编译为对象、静态库甚至动态库。我希望它们是通用的,上面的 CMakeLists.txt 将决定做什么。

我尝试使用add_library(${PROJECT_NAME}-obj OBJECT ${SRCLIB}),但出现错误:

CMakeLists.txt:22 (target_include_directories):
  Cannot specify include directories for target "LibPublic" which is not
  built by this project.

【问题讨论】:

  • 我认为您将CMake Object libraries 与静态库混为一谈。
  • 我不太明白。我不明白为什么我无法为我的简单用例找到正确的答案......为什么 CMake 让事情变得如此复杂。

标签: c++ cmake


【解决方案1】:

给定以下文件和一些虚拟 cpp 文件:

cmake_minimum_required(VERSION 3.10)
project(foo)

add_library(Base STATIC base.cpp)
add_library(Public STATIC public.cpp)
target_sources(Public PRIVATE $<TARGET_OBJECTS:Base>)

我最终得到一个 libPublic.a,其中包含两个库中的函数。

请注意,这是您的问题的解决方案,但可能不是您的基本要求的解决方案:静态库是函数的简单集合,“Base”中的函数是显而易见的。

【讨论】:

  • 谢谢,问题是它们位于两个不同的文件夹中。并且或多或少是独立的。其他库或应用程序的 CMakeLists.txt 可以add_subdirectory() 他们。
  • 如果libpublic要包含libbase,它不是独立的定义。
  • 我的意思是,两个“库”都可以作为静态库链接,但有些应用程序希望它们作为源而不将它们作为库链接。 (以便在没有额外 .a 文件的情况下提供应用程序)
  • 这些是重要的限制,应该成为您问题的一部分。
  • 我编辑过,我真的觉得解决方案在 CMake 的“对象库”中,但找不到方法。我错了吗?
猜你喜欢
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
相关资源
最近更新 更多