基于TIARMCLANG编译OpenCV链接CCS项目时出现ABI属性不兼容错误
解决TIARMCLANG编译OpenCV后链接CCS项目的#16004-D ABI不兼容错误
问题原因
1. 编译选项冲突
从提供的编译命令和CMake选项可见,同时存在互斥的编译参数:-fno-pic -fno-pie和-fPIC。这会导致编译器生成的目标文件ABI属性(如GOT使用方式、数据段处理规则)混乱,出现Tag_ABI_PCS_GOT_use、Tag_ABI_PCS_RO_data、Tag_ABI_PCS_RW_data属性值不一致的情况。
2. OpenCV编译选项与CCS项目选项不匹配
CCS Studio项目的默认编译/链接选项,与编译OpenCV时使用的参数存在差异,导致链接阶段检测到不同目标文件的ABI属性不兼容,触发#16004-D错误。
解决方法
步骤1:清理CMake中的冲突编译选项
移除CMake配置中互斥的-fno-pic -fno-pie或-fPIC参数,保持选项一致。如果需要位置无关代码(PIC),保留-fPIC;否则彻底移除-fPIC。
修改后的CMake选项示例:
SET(CMAKE_C_FLAGS "-w --specs=nosys.specs -frtti -fshort-enums -fshort-wchar -Wno-unknown-warning-option -Wno-unused-command-line-argument -Wno-suggest-override -mfpu=vfpv3-d16 -Wno-narrowing -fexceptions -fpermissive -mcpu=cortex-r5 -mthumb -mfloat-abi=hard -mfpu=vfpv3-d16 -I/home/kowshik/Desktop/opencv_porting/opencv_with_tiarmclang/fake_root_test/include" CACHE STRING "c compiler flags") SET(CMAKE_CXX_FLAGS "-w --specs=nosys.specs -frtti -fshort-enums -fshort-wchar -Wno-unknown-warning-option -Wno-unused-command-line-argument -Wno-suggest-override -mfpu=vfpv3-d16 -mabi=aapcs -Wno-narrowing -fexceptions -fpermissive -mcpu=cortex-r5 -mthumb -mfloat-abi=hard --std=c++11 -I/home/kowshik/Desktop/opencv_porting/opencv_with_tiarmclang/fake_root_test/include" CACHE STRING "cxx compiler flags")
(若需要PIC,在C/C++FLAGS末尾添加-fPIC即可)
步骤2:对齐CCS项目与OpenCV的编译选项
在CCS Studio中打开项目属性,逐一检查并设置以下选项,确保与编译OpenCV时的参数完全一致:
- 处理器架构:确认启用
--cpu=cortex-r5、-mthumb、-mfloat-abi=hard、-mfpu=vfpv3-d16 - ABI设置:启用
-mabi=aapcs - 位置无关代码:如果OpenCV编译用了
-fPIC,项目也要启用该选项;否则禁用 - 其他选项:
-fshort-enums、-fshort-wchar、C++标准--std=c++11等参数必须完全匹配
步骤3:重新编译OpenCV库
删除之前的OpenCV build目录,重新运行CMake配置(使用修改后的选项),然后完整编译OpenCV库,确保所有目标文件的ABI属性统一。
步骤4:验证ABI属性(可选)
使用TIARMCLANG的tiarmobjdump工具检查OpenCV库和CCS项目目标文件的ABI属性,确认值一致:
tiarmobjdump -x libopencv_core.a | grep Tag_ABI_PCS
对比CCS项目生成的目标文件属性,确保Tag_ABI_PCS_GOT_use、Tag_ABI_PCS_RO_data、Tag_ABI_PCS_RW_data的属性值完全相同。
内容的提问来源于stack exchange,提问作者kowshik
相关产品推荐
相关产品推荐

