为何CMake会将第三方库头文件与我的可执行文件一同安装?
解决CMake FetchContent安装时第三方依赖被一并安装的问题
针对你遇到的问题,以下是几种适配CMake 3.30.5版本的有效解决方式:
方法一:在FetchContent声明时排除第三方项目的默认构建目标
修改你的PDFHummus.cmake文件,在FetchContent_Declare中添加EXCLUDE_FROM_ALL ON参数,切断第三方项目install目标与主项目install流程的关联:
if(NOT PDFHummus_POPULATED) Include(FetchContent) FetchContent_Declare( PDFHummus GIT_REPOSITORY ${REPO} GIT_TAG v4.6.8 DOWNLOAD_EXTRACT_TIMESTAMP FALSE FIND_PACKAGE_ARGS EXCLUDE_FROM_ALL ON # 新增该行 ) FetchContent_MakeAvailable(PDFHummus) endif()
该参数会将第三方项目的所有目标标记为EXCLUDE_FROM_ALL,仅当显式引用时才会构建,其install规则不会被主项目的install目标触发。
方法二:显式指定仅安装自身项目目标
无需修改FetchContent声明,直接构建项目专属的安装子目标即可。CMake会为每个自定义目标生成<TARGET_NAME>-install格式的安装子目标,执行以下命令:
cmake --build --preset Debug-Windows --target=${PROJECT_NAME}-install
此命令仅执行你自己项目中install(TARGETS ${PROJECT_NAME} ...)定义的安装规则,完全跳过第三方依赖的安装流程。
方法三:手动禁用第三方项目的install规则
若前两种方法不适用,可在引入第三方项目后,单独禁用其install目标。在FetchContent_MakeAvailable后添加以下代码:
FetchContent_MakeAvailable(PDFHummus) # 禁用PDFHummus的install目标 get_target_property(_pdfhummus_install_target PDFHummus::PDFWriter INSTALL_REMOVE) if(NOT _pdfhummus_install_target) set_target_properties(PDFHummus::PDFWriter PROPERTIES INSTALL_REMOVE ON) endif()
这种方法需要针对每个第三方依赖单独处理,适合需要精细控制的场景。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

