文章目录
- 1. 问题背景
- 2. CMake中添加-fPIC的方式
- 3. 检查-fPIC是否添加成功
- 4. CMakeLists.txt中已经配置-fPIC参数但未生效的解决方案
1. 问题背景
博主的库会被编译成一个供第三方使用的静态库,第三方在使用博主的库编译动态库时,若不加-fPIC
会报unresolvable R_AARCH64_ADR_PREL_PG_HI21 relocation against symbol stderr@@GLIBC_2.17,因此必须要配置-fPIC
参数
2. CMake中添加-fPIC的方式
- 方法1:在CMakeLists.txt中添加如下代码
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
- 方法2:对特定目标设置参数
add_library(mylib SHARED mylib.c) set_target_properties(mylib PROPERTIES COMPILE_FLAGS "-fPIC")
- 方法3:在CMakeLists.txt中添加
add_compile_options(-fPIC)
- 方法4:在CMakeLists.txt中添加
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
- 方法5:在执行cmake时,添加参数
-DCMAKE_C_FLAGS=-fPIC -DCMAKE_CXX_FLAGS=-fPIC
3. 检查-fPIC是否添加成功
执行cmake后,检查生成的CMakeCache.txt
中是否存在-fPIC
字段,若无则说明配置失败。
4. CMakeLists.txt中已经配置-fPIC参数但未生效的解决方案
博主在CMakeLists.txt
中已经做了-fPIC
的配置,但发现CMakeCache.txt
中并没有-fPIC
字段,导致第三方用户在编译动态库的时候报stderr@@GLIBC_2.17
。
最后的解决方案按第2节中的方法5进行实现,即在执行cmake的时候手动配置参数-DCMAKE_C_FLAGS=-fPIC -DCMAKE_CXX_FLAGS=-fPIC
,具体原因未知,大概跟cmake的变量作用范围有关,先解决问题再说。
参考链接:
- https://www.cnblogs.com/hjj801006/p/14360889.html
- https://www.cnblogs.com/dragoo1/articles/17919321.html
- https://blog.csdn.net/gpf0845531213/article/details/97662417