android 16kb适配target_link_options(名字 PRIVATE "-Wl,-z,max-page-size=16384")这个写法对么
这个写法基本正确,但需要注意几个细节:
语法层面:
target_link_options(名字 PRIVATE "-Wl,-z,max-page-size=16384") 是 CMake 的标准写法,用于向链接器传递参数。
-Wl,... 是 GCC/Clang 的语法,表示将后面的内容传递给链接器(ld)。-z max-page-size=16384 是 ld 的参数,用于设置最大页大小为 16KB(Android 16KB 对齐要求)。Android 16KB 对齐:
Android 15+ 要求 ELF 文件按 16KB 对齐(max-page-size=16384),这个参数确实能强制对齐。
参数可能被转义:
CMake 可能会错误地将 -Wl,-z,max-page-size=16384 拆分为多个参数。更稳妥的写法是:
target_link_options(名字 PRIVATE "-Wl,-z,max-page-size=16384")
或使用 SHELL 语法(推荐):
target_link_options(名字 PRIVATE "SHELL:-Wl,-z,max-page-size=16384")
SHELL: 前缀告诉 CMake 不要转义引号或逗号。
NDK 版本兼容性:
确保 NDK 版本支持 16KB 对齐(NDK r26+ 已支持)。旧版本可能需要额外参数(如 -Wl,--no-warn-shared-textrel)。
全局生效(可选):
如果希望对所有目标生效,可以设置全局链接标志:
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,max-page-size=16384")
target_link_options(名字 PRIVATE "SHELL:-Wl,-z,max-page-size=16384")
构建后检查 .so 或 .exe 的 ELF 头:
readelf -l your_binary | grep "Align"
应看到 0x4000(即 16384 字节)的对齐值。