编译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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统