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

How to structure CMake library project with optional executable

我正在尝试学习 CMake,但我正在处理一个问题,这个问题对我来说太难了 google 通过文档,因为我什至不知道要搜索哪些短语。

我有一个主要目标是静态库的存储库。不过,我还编写了一个简单的命令行演示工具,用于演示该库的功能,并帮助我对其进行测试和调试。项目的目录结构是这样的

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 它只会构建库和当我编写 make cli 时,它构建了演示工具。

我的主要问题是:

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

你能给我指明正确的方向吗?

when i run make

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

How do i add an optional target to the root CMakeLists and point it to the cli directory.

你这样做 add_executable(executable_name EXCLUDE_FROM_ALL sources),这样在没有明确指定目标的情况下构建时目标将被排除(即当使用 --target all 构建时)。

我会在 tools/cli 里面写一个普通的 CMakeLists.txt 然后做 add_subdirectory(tools/cli EXCLUDE_FROM_ALL).

How to specify that the executable depends on the library

只是 lint,使用 target_link_libraries(executable_name PRIVATE library_name)

make the library build first.

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

How to structure CMake library project with optional executable

我愿意:

# 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 ,但这不是最好的。

what phrases to search for.

搜索 EXCLUDE_FROM_ALL 并且由于问题 #2,搜索关于库和链接的基本 cmake 介绍。