You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android NDK C++代码如何开启位置无关编译标志-fpic

核心问题解答

  • 所需标志:Android平台开启PIC(位置无关代码)支持使用编译链接标志-fPIC,该标志生成的代码内存加载地址不固定,可满足安全合规要求。
  • 配置可选两种路径:可在build.gradle中配置全局生效,或在CMakeLists.txt中配置仅对当前原生库生效,可按需选择。

方式1:在build.gradle中配置(全局生效,推荐)

在对应模块的build.gradle的android.defaultConfig.externalNativeBuild.cmake节点下添加cppFlags参数即可,配置会对该模块下所有CMake编译的原生库生效,适合多原生库项目统一配置:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                // 直接追加-fPIC即可,已有其他编译参数可拼接在后面
                cppFlags "-fPIC"
            }
        }
    }
    // 其他原有配置保持不变
}

方式2:在CMakeLists.txt中配置(仅对当前库生效)

如果仅需要给当前app-config-lib库开启PIC,不需要修改gradle配置,可直接修改你项目的CMakeLists.txt,有两种写法可选:

写法A:全局追加编译参数

cmake_minimum_required(VERSION 3.4.1)

# 新增两行,显式开启C/C++代码的PIC编译
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")

add_library(
        app-config-lib
        SHARED
        app-config-native-lib.cpp)

find_library(
        log-lib
        log)

target_link_libraries(
        app-config-lib
        ${log-lib})

写法B:仅针对单个库开启PIC(更精准)

cmake_minimum_required(VERSION 3.4.1)

add_library(
        app-config-lib
        SHARED
        app-config-native-lib.cpp)

# 新增:仅给app-config-lib库开启位置无关代码属性
set_target_properties(app-config-lib PROPERTIES
        POSITION_INDEPENDENT_CODE ON)

find_library(
        log-lib
        log)

target_link_libraries(
        app-config-lib
        ${log-lib})

补充说明

Android NDK r17及以上版本编译SHARED类型共享库时默认会开启-fPIC,但如果有安全合规要求必须显式声明的场景,建议手动添加上述配置强制开启,避免不同NDK版本默认行为差异导致合规校验不通过。

内容的提问来源于stack exchange,提问作者Nouman Bhatti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:27:04