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
相关产品推荐
相关产品推荐

