编译OSIP(原生库) 到Arm平台下(android、iOS),makefile实战用例

2024-03-16 11:48

本文主要是介绍编译OSIP(原生库) 到Arm平台下(android、iOS),makefile实战用例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原标题:在ubuntu下交叉编译linphone支持库OSIP 到Arm平台下(android、iOS)的正确方法

近项目里面要编译linphone中用的开源SIP库——OSIP给移动端使用。 网上关于交叉编译OSIP到arm平台下的方法大多语焉不详。尤其可恨的是许多雷同的,还特么不能用!!! 亲们,你们在转载之前有实际测试过么?!!!!! 我还是那句话: 人云亦云是畜生啊!!!

 

废话少说。说一下编译过程:

OSIP的编译也是三步走: 1)configure 2)make 3)make install

 

在执行configure脚本的时候,少不了要填入很多参数。 OSIP的configure和ffmpeg不太一样, 它有很多编译参数是需要通过环境变量传递进去的。从帮助文档中可以看到有下面这些:

  CC          C compiler command

  CFLAGS      C compiler flags

  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a

              nonstandard directory <lib dir>

  LIBS        libraries to pass to the linker, e.g. -l<library>

  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if

              you have headers in a nonstandard directory <include dir>

  CPP         C preprocessor

  CXX         C++ compiler command

  CXXFLAGS    C++ compiler flags

  CXXCPP      C++ preprocessor

  F77         Fortran 77 compiler command

  FFLAGS      Fortran 77 compiler flags

 

发一下我用的编译脚本:

我的gcc用的是androidNDK里面提供的, 根据实际情况修改即可

#!/bin/sh

export NDKROOT="/opt/android-ndk-r8c"

export PREBUILT=$NDKROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86

CC=$PREBUILT/bin/arm-linux-androideabi-gcc

export CC

CFLAGS="--sysroot=/opt/android-ndk-r8c/platforms/android-9/arch-arm -fPIC -DANDROID -DHAVE_PTHREAD-mfpu=neon -mfloat-abi=softfp -I$NDKROOT/platforms/android-9/arch-arm/usr/include"

export CFLAGS

LDFLAGS="-Wl,-T,$PREBUILT/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x -Wl,-rpath-link=$NDKROOT/platforms/android-9/arch-arm/usr/lib -L$NDKROOT/platforms/android-9/arch-arm/usr/lib -nostdlib "

export LDFLAGS

./configure --prefix=/home/hl/linphone/osip/libs --host=arm-linux  --disable-shared --enable-static

 

注意, “=”一定要紧接着变量,不然不能传递。

 

编译过程的一些报错:

1)  osip_port.c:82:26: fatal error: sys/unistd.h: No such file or directory

ort.lo -MD -MP -MF ".deps/osip_port.Tpo" -c -o osip_port.lo osip_port.c; \

        then mv -f ".deps/osip_port.Tpo" ".deps/osip_port.Plo"; else rm -f ".deps/osip_port.Tpo"; exit 1; fi

 /opt/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../include -Wall -Wcast-align -Wchar-subscripts -Wformat -Winline -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wpointer-arith --sysroot=/opt/android-ndk-r8c/platforms/android-9/arch-arm -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp -I/opt/android-ndk-r8c/platforms/android-9/arch-arm/usr/include -g -DENABLE_TRACE --sysroot=/opt/android-ndk-r8c/platforms/android-9/arch-arm -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp -I/opt/android-ndk-r8c/platforms/android-9/arch-arm/usr/include -MT osip_port.lo -MD -MP -MF .deps/osip_port.Tpo -c osip_port.c -o osip_port.o

osip_port.c:82:26: fatal error: sys/unistd.h: No such file or directory

compilation terminated.

make[3]: *** [osip_port.lo] Error 1

make[3]: Leaving directory `/home/hl/linphone/osip/src/osipparser2'

make[2]: *** [all-recursive] Error 1

make[2]: Leaving directory `/home/hl/linphone/osip/src'

make[1]: *** [all-recursive] Error 1

make[1]: Leaving directory `/home/hl/linphone/osip'

make: *** [all] Error 2

sys上级目录的unistd 拷贝到sys下面就ok

 

2) ../../include/osip2/internal.h:97:2: error: #error No thread implementation found!

看了一下出错部分的代码:

#if !defined(__VXWORKS_OS__) && !defined(__PSOS__) && \

!defined(WIN32) && !defined(_WIN32_WCE) && !defined(HAVE_PTHREAD_WIN32) && \

    !defined(HAVE_PTHREAD) && !defined(HAVE_PTHREAD_H) && !defined(HAVE_PTH_PTHREAD_H)

#error No thread implementation found!

#endif

 

说明要预定义一些东西才能通过, 而在 

/opt/android-ndk-r8c/platforms/android-9/arch-arm/usr/include 这个下面没有一个头文件里面有这个定义。

那么只能在config.sh的CFLAG里面添加了,按照前文说的方法修改config.sh即可

 

编译出来的两个库,默认是在这里:

hl@hl-VirtualBox:~/linphone/osip$ find ./ -name "*.a"

./src/osip2/.libs/libosip2.a

./src/osipparser2/.libs/libosipparser2.a

 

原文链接:http://blog.sina.com.cn/s/blog_4868f98601017aoo.html

这篇关于编译OSIP(原生库) 到Arm平台下(android、iOS),makefile实战用例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/815403

相关文章

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库