小编Pow*_*ies的帖子

如何为“类似 boost”的多组件库编写 cmake 模块?

我目前正在编写一个 C++ 库,它有几个“子库”,例如 boost 库。

让我们将库命名为“TestLib”和子库“Base”和“Ext”,其中 Base 包含基本内容,不依赖于任何其他子库。然而,Ext 依赖于某些 Base 类。

每个“子库”都应该编译成一个单独的 .a 或 .so 文件,但它们都应该共享一个命名空间(TestLib)。现在我的目标是编写干净的 cmake 脚本以实现这一目标。

最后,我希望能够在 cmake 中做这样的事情:

find_package(TestLib 0.1 REQUIRED COMPONENTS Base Ext)
Run Code Online (Sandbox Code Playgroud)

或者

target_link_libraries(someapplication
PUBLIC
    TestLib::Base
)
Run Code Online (Sandbox Code Playgroud)

我将每个“子库”放在一个单独的 git 存储库中,并将它们作为子模块添加到一个新存储库中,该存储库只有一个 CMakeLists.txt,它只在每个存储库上调用 add_subdirectory。

我实现的大部分 cmake 东西,都是从https://pabloariasal.github.io/ 上的这个很棒的教程中获得的

并且 Base 部分按预期工作(这并不奇怪,因为它不依赖于其他任何东西)。

但是我的问题来自于 Ext 部分。为了编译它,我必须链接到 Base 库,这应该不会太难,并且经过一些试验和错误,我确信我会让它工作。

但我想以正确的方式做到这一点。

我的方法是

find_package(TestLib COMPONENTS Base)
Run Code Online (Sandbox Code Playgroud)

在 TestLib.Ext 的 CMakeLists.txt 中。但这无法找到,因为它没有 TestLibConfig.cmake。

这是有道理的,但我不知道在这个文件中放什么。

我试图提供一些准确描述我的问题的代码,但由于在这里发布太多了,我为此创建了一个 github:

https://github.com/PowerSupplyTopologies/TestLib

这应该包含所有相关的代码。

这对你们中的一些人来说可能是微不足道的,但我敢打赌有更多的人可以从这种方法中受益。

预先感谢您的任何想法。

编辑:

Base的CMakeLists.txt中的库创建是:

set(TARGET_NAME testlibbase)

add_library(${TARGET_NAME}
    src/ClassA.cpp
    src/ClassB.cpp
)

#Add an alias …
Run Code Online (Sandbox Code Playgroud)

c++ cmake libraries git-submodules cmake-modules

8
推荐指数
1
解决办法
826
查看次数

标签 统计

c++ ×1

cmake ×1

cmake-modules ×1

git-submodules ×1

libraries ×1