SylixOS 中链接 libvpmpdm.a 时不能正常运行业务代码?

SylixOS 中链接 libvpmpdm.a 时不能正常运行业务代码?

Q:当使用静态库libvpmpdm.a,链接可执行程序时,操作系统会因为能找到main函数,但是找不到start函数,而不启动应用程序。如果操作系统是release版本的,应用程序不但起不来,shell上面没有任何的异常输出,导致追查程序启动异常非常困难。
我们做了个测试,如果将libsylixos/Output目录下的 libvpmpdm.so 删除,直接编译SylixOS应用,SylixOS 应用将链接了 libsylixos/Output 目录下 libvpmpdm.a 静态库,因为在链接时进程的入口点函数 _start 和其它关键函数没有被显式调用,会被链接器“优化”掉,导致 SylixOS 装载该应用时提示 “vprocRun() error: can not find entry function.”,针对您提出的“只使用静态库,不使用动态库的业务场景”,可以在 SylixOS 应用的 Makefile 文件里的 LOCAL_DEPEND_LIB 加入“-Wl,--whole-archive -lvpmpdm -Wl,--no-whole-archive”,即将 libvpmpdm.a 的所有内容都链接进应用。


注意:针对只使用静态库,不使用共享库的业务场景,如果libsylixos/Output目录下的 libvpmpdm.so文件被删除,SylixOS App程序将自动连接libvpmpdm.a文件,这种情况将导致 SylixOS App 运行时出现“vprocRun() error: can not find entry function.”的错误提示,因此在必须使用静态库(libvpmpdm.a)的业务场景,必须修改 SylixOS App 对应的 app_demo.mk 文件的 LOCAL_LINKFLAGS 加入参数“-Wl,--whole-archive -lvpmpdm -Wl,--no-whole-archive”, 配置示例如下:(选择 SylixOS App工程点击鼠标右键,选择“Properties”弹出如图所示对话框)

    • Related Articles

    • error adding symbols:Bad value

      Q:SylixOS 系统编译引用了静态库的 App 时报错,怎么解决? 应用程序在引用静态库的时候只能选择 SylixOS Shared Lib 创建出的静态或动态库,只有 SylixOS Shared Lib 创建出的库才具有动态装载功能。 出现类似这种原因是因为使用了SylixOS Kernel Static Lib 创建出的静态库,这一类库是不具备动态装载能力的,即使编译可以通过,在复杂程序中运行也会受到干扰。
    • 应用程序报错:error function not implemented

      Q:运行应用程序提示如图的错误,对应的库已上传,在自己的设备上可以正常。其他设备会报错 “error function not implemented” 上传的时候没有设置 ftp 的 bin 模式,可以通过将原来的 bin 文件读出来和上传之前的 bin 文件对比查看其差异
    • error:cannot find -lvpmpdm

      Q:SylixOS 系统编译 App 时报错,error:cannot find -lvpmpdm SylixOS 中所有的程序都是依赖基础的内核库编译的,即依赖 Base 库,-lvpmpdm 是 Base 生成的库,出现此问题的原因是依赖的 Base 没有编译;先编译 Base 可解决。
    • can not find symbol:xxx

      问:can not find symbol:xxx 在不使用第三方库时使用 Posix 接口进行线程创建,即调用 posix_create 函数时,程序在系统下运行时显示如 图1 错误,提醒无法找到以上函数的符号。 图 1.报错信息 在初始化函数 API_ThreadInit 中的 _TCBBuild 构建 TCP 属性块函数中有对钩子函数的使用。图2 图 2.报错函数位置 通过源码追踪,发现 Hook 函数并没有进行函数底层实现,且没有编译到 Base 工程的 symbol.ld ...
    • qt5中链接使用.so动态库及相关函数

      Q:如何在qt5中链接使用.so动态库及相关函数 1. 编译生成动态库文件并上传至SylixOS文件系统内(需要上传至qt5的path目录内) 图1 编写并生成动态库工程 图2 上传动态库文件 qt5的path目录可env命令查看,见下图 图2 查看qt5默认库路径 2. 在qt工程pro文件内添加动态库相关本地配置(用于编译) 图4 增加动态库链接配置 3. 部署qt应用程序至SylixOS设备中 4. 运行测试 图5 程序运行测试