我正在尝试学习 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 }} 它构建了演示工具。
我的主要问题是:
make cli
目录。你能指出我正确的方向吗?
答案 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 介绍。