如何使用可选的可执行文件构建 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
时,它构建了演示工具。
我的主要问题是:
- 如何将可选目标添加到根 CMakeLists 并将其指向
cli
目录。
- 如何指定可执行文件依赖库并使库先构建。
- 如何 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 介绍。
我正在尝试学习 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
时,它构建了演示工具。
我的主要问题是:
- 如何将可选目标添加到根 CMakeLists 并将其指向
cli
目录。 - 如何指定可执行文件依赖库并使库先构建。
- 如何 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 介绍。