如何使用可选的可执行文件构建 CMake 库项目

时间:2021-07-04 18:12:26

标签: cmake static-libraries build-system

我正在尝试学习 CMake,但我正在处理一个对我来说太难的问题,因为我什至不知道要搜索什么短语。

我有一个存储库,其主要目标是静态库。但是,我还编写了一个简单的命令行演示工具,演示了该库可以做什么,并帮助我测试和调试它。项目的目录结构是这样的

libname
    include  - header files of the library
    src  - sources of the library
    tools
        cli
            src  - sources of the demo executable

如果这个描述还不够,可以在这里找到整个存储库https://github.com/Youda008/OpenRGB-cppSDK

现在我想以某种方式编写 CMakeList 文件,以便将可执行文件添加为可选目标,以便稍后我运行 make 时它只构建库,当我编写 {{1 }} 它构建了演示工具。

我的主要问题是:

  1. 如何将可选目标添加到根 CMakeLists 并将其指向 make cli 目录。
  2. 如何指定可执行文件依赖于库并首先构建库。
  3. 在用户的构建目录中构建后如何将可执行文件链接到该库。

你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

<块引用>

当我运行 make

不要使用make,而是使用cmake --build <builddir>,这样当您决定转向 Ninja 以提高速度时,您就不必更改您的脚本。

<块引用>

如何将可选目标添加到根 CMakeLists 并将其指向 cli 目录。

您执行 add_executable(executable_name EXCLUDE_FROM_ALL sources),这样在未明确指定目标的情况下构建时(即使用 --target all 构建时)将排除目标。

我会在 CMakeLists.txt 内写一个普通的 tools/cli,然后执行 add_subdirectory(tools/cli EXCLUDE_FROM_ALL)

<块引用>

如何指定可执行文件依赖于库

只需整理一下,使用 target_link_libraries(executable_name PRIVATE library_name)

<块引用>

首先构建库。

不需要采取任何行动 - cmake 将生成已经自行完成的构建系统,这就是 cmake 的基本存在。

<块引用>

如何使用可选的可执行文件构建 CMake 库项目

我愿意:

# libname/CMakeLists.txt
add_library(libname ...)
option(BUILD_CLI "Set me to enable building cli executable")
set(arg)
if(BUILD_CLI)
   set(arg EXCLUDE_FROM_ALL)
endif()
add_subdirectory(tools/cli ${arg})

# libname/tools/cli/CMakeLists.txt
add_executable(exename ...)
target_link_libraries(exename libname)

例如,您可以查看 https://github.com/Lora-net/LoRaMac-node/blob/master/src/CMakeLists.txt#L206 ,但它不是最好的。

<块引用>

要搜索的词组。

搜索 EXCLUDE_FROM_ALL 并根据问题 #2,搜索有关库和链接的基本 cmake 介绍。

相关问题