本文主要是介绍编译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实战用例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!