跳到主要内容

kmpkg_check_linkage

校验端口可用的库和CRT(C运行时库)链接选项。

用法

kmpkg_check_linkage(
[ONLY_STATIC_LIBRARY | ONLY_DYNAMIC_LIBRARY]
[ONLY_STATIC_CRT | ONLY_DYNAMIC_CRT]
)

参数

ONLY_STATIC_LIBRARY

表明此端口仅支持以静态库链接方式构建。

若用户请求动态构建,ONLY_STATIC_LIBRARY 会触发提示信息打印,而非致命错误。

ONLY_DYNAMIC_LIBRARY

表明此端口仅支持以动态/共享库链接方式构建。使用此选项时,端口开发者应在端口的 kmpkg.json 文件的 "supports" 表达式中添加 !(static & staticcrt),以便提前向使用者发出失败警告。

ONLY_STATIC_CRT

表明此端口仅支持以静态CRT链接方式构建。

ONLY_DYNAMIC_CRT

表明此端口仅支持以动态/共享CRT链接方式构建。

说明

若三元组(triplet)请求的 KMPKG_LIBRARY_LINKAGE 配置与端口支持的配置不符,且将 KMPKG_LIBRARY_LINKAGE 改为端口支持的配置被判定为安全操作,则 kmpkg_check_linkage 会修改 KMPKG_LIBRARY_LINKAGE 为端口支持的配置并输出警告。这意味着端口最终生成的产物可能不符合用户预期,但替代方案只能是直接构建失败。

kmpkg_check_linkage 拟将 KMPKG_LIBRARY_LINKAGE 改为 dynamic,但三元组请求的 KMPKG_CRT_LINKAGEstatic,则该修改会被判定为不安全操作,kmpkg_check_linkage 会执行失败。以静态CRT构建动态库会产生许多开发者意想不到的问题,且大多数端口未针对该场景做适配。

例如,在Windows系统中,每个DLL会获取独立的CRT副本,这意味着此类DLL无法跨DLL边界共享标准库组件;在非Windows系统中,不同的.so或.dylib文件可能导致来自不同CRT版本的不兼容符号被同时加载。

若你在使用某个端口时,该端口在 kmpkg_check_linkage 阶段执行失败,可考虑选择将 KMPKG_CRT_LINKAGE 设置为 dynamic 的三元组。若你明确知晓自己的操作目的、理解静态CRT搭配动态库可能引发的问题,且确信该端口能安全处理此配置,可编写自定义三元组,显式将 KMPKG_LIBRARY_LINKAGE 设置为 dynamicKMPKG_CRT_LINKAGE 设置为 static。示例如下:

if("${PORT}" STREQUAL "the-name-of-the-port-you-want-to-control")
set(KMPKG_LIBRARY_LINKAGE dynamic)
set(KMPKG_CRT_LINKAGE static)
endif()

示例

源码

scripts/cmake/kmpkg_check_linkage.cmake