CPU编译与运行常见问题

一、 编译链接成功,程序运行崩溃:

  1. android平台
    a) dynamic_cast编译通过,运行崩溃
    编译选项设置错误,需要设置-DANDROID_STL=c++_shared,解释如下:

gnustl:android上GNU C++库,对应GNU/Linux系统中的libstdc++
 这个库仅仅和GCC绑定,后期不在更新,最新的NDK不再支持
 此库和clang存在部分冲突
gnustl_static:使用的就是gnustl的静态库,相关代码被连接到输出库中
gnustl_shared:动态依赖,但由于android系统的碎片化,各个版本的libgnustl_share.so不一致,就导致崩溃或者运行异常问题
建议使用 gnustl_static ,通常在application.mk中设置为:APP_STL:=gnustl_static

c++_static:以静态链接方式使用的LLVM libc++
c++_share:以动态链接方式使用的LLVM libc++
目前大多使用的事LLVM的库文件,并且使用clang编译。

  1. IOS平台
    a) 链接静态库dfmlp.a成功,但是运行崩溃在mlp内存,发现是由于静态库链接时,operator的函数并未进行注册,因此没有链接,导致运行时函数不存在而崩溃,解决方法:

动态库链接并不存在此类问题,因此在动态加载时,会自动注册operator内部函数,静态库由于operator内的函数符号并未链接进来,因此函数无法注册。

因此静态库在被链接时需要将全部符号都链接进去,依靠编译选项即可:
gcc:-wl,--whole-archive xxx.a –wl,--no-whole-archive
clang: -force_load xxxx/xxx.a (需要静态库的绝对路径,-all_load也可,与-force_load区别自行查找)

二、 编译报错

  1. IOS cmake报错,提示xcode的路径设置不对,即SDK的path设置错误导致,可根据CMAKE报错提示进行设置,或者直接在cmake中设置

-DCMAKE_IOS_DEVELOPER_ROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/
-DCMAKE_IOS_SDK_ROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -GXcode

  1. android NDK编译出错,提示-lrt not found。原因:由于openMp需要使用-lrt选项(一个libc库),而ndk12,13没有这个库,即不支持openMp这个选型,因此报错。删除openMp选项即可

三、其他

  1. 动态库dlopen失败,平台不一致或者动态库缺少符号未定义;
  2. 随机崩溃问题:常见为读越界导致;
  3. 固定崩溃:内存写越界;
  4. bus error:某些平台,如qnx,引擎的开辟的内存未对齐导致;

你可能感兴趣的:(CPU编译与运行常见问题)