CMake如何设置未被使用的自定义库不参与编译构建?
CMake未被依赖的库自动跳过编译的实现方法
问题原因
你通过add_library定义的目标默认会被加入CMake的默认构建目标all中,执行全量构建时默认会构建所有all包含的目标,和该库是否被其他目标链接没有关系,所以删除链接语句后库仍然会被编译。
实现方案
你可以在定义库的时候添加EXCLUDE_FROM_ALL参数即可实现需求,语法如下:
add_library(network_transport EXCLUDE_FROM_ALL # 此处替换为你实际的库源文件路径 src/transport.cpp src/connect.cpp include/transport.h )
- 加了该参数后,该库默认不会被加入
all目标,只有当有其他被构建的目标显式依赖/链接该库时,CMake才会自动触发该库的编译流程 - 如果你需要单独构建这个库(比如调试库本身功能),直接指定构建该目标即可,比如Makefile生成器下执行
make network_transport,IDE中选中对应目标单独构建即可
注意事项
- 如果你使用Visual Studio等多配置生成器,可以配合CMake 3.19以上版本的
EXCLUDE_FROM_DEFAULT_BUILD参数使用,效果和EXCLUDE_FROM_ALL在单配置生成器下的表现一致 - 不要给最终要打包发布的库加该参数,否则执行安装流程时可能找不到对应的库产物
内容的提问来源于stack exchange,提问作者Олег Привалов
相关产品推荐
相关产品推荐

