记录一下 ortp 在PC上编译及交叉编译情况。
这里使用的是 release 5.1 版本。
https://github.com/BelledonneCommunications/ortp
下载:
git clone https://github.com/BelledonneCommunications/ortp.git
切换一下分支:
git checkout release/5.1
由于编译依赖于 bctoolbox 库,所以再此之前要先编译安装bctoolbox。
参考:bctoolbox 交叉编译
如果缺少这个依赖包会出现如下错误:
CMake Error at CMakeLists.txt:78 (find_package):
By not providing "Findbctoolbox.cmake" in CMAKE_MODULE_PATH this project
has asked CMake to find a package configuration file provided by
"bctoolbox", but CMake did not find one.
Could not find a package configuration file provided by "bctoolbox"
(requested version 0.2.0) with any of the following names:
bctoolboxConfig.cmake
bctoolbox-config.cmake
Add the installation prefix of "bctoolbox" to CMAKE_PREFIX_PATH or set
"bctoolbox_DIR" to a directory containing one of the above files. If
"bctoolbox" provides a separate development package or SDK, be sure it has
been installed.
这里打算将编译出来的库放在上级目录下的target_pc目录。
在克隆下来的工程根目录创建文件夹build_dir,并且在里面创建编译脚本。
build.sh:
#!/bin/sh
#编译工具
COMPILER_CC=gcc
COMPILER_CXX=g++
#安装位置
COMPILER_PREFIX=$(pwd)/../../target_pc
#依赖库位置
COMPILER_LIB=$(pwd)/../../target_pc
cmake -DCMAKE_INSTALL_PREFIX=$COMPILER_PREFIX \
-DCMAKE_C_COMPILER=$COMPILER_CC \
-DCMAKE_CXX_COMPILER=$COMPILER_CXX \
-DCMAKE_PREFIX_PATH="$COMPILER_LIB" \
..
make
make install
在脚本里面制定了编译安装的指定目录,所使用的gcc、g++
执行。
会生成头文件和动态、静态库。
交叉编译主要的点在于要配置交叉编译工具(gcc)以及指定编译平台的依赖库(sysroot)。
还有指定已经交叉编译好的 bctoolbox 的库。
参考:bctoolbox 交叉编译
这里打算将编译出来的库放在上级目录下的target_cross目录。
在克隆下来的工程根目录创建文件夹build_dir,并且在里面创建编译脚本。
build.sh:
#!/bin/sh
#编译工具路径
QL_CROSSTOOLS=/opt/ql_crosstools/ql-ag550qcn-le20-gcc820-v1-toolchain/gcc/usr/bin/arm-oe-linux-gnueabi
#SYSROOT路径
QL_SYSROOT=/home/hrx/work/ql-sysroots
#编译工具
COMPILER_CC=$QL_CROSSTOOLS/arm-oe-linux-gnueabi-gcc
COMPILER_CXX=$QL_CROSSTOOLS/arm-oe-linux-gnueabi-g++
#编译选项
COMPILER_FLAGS="-march=armv7-a -marm -mfpu=neon -mfloat-abi=hard"
#安装位置
COMPILER_PREFIX=$(pwd)/../../target_cross
#依赖库位置
COMPILER_LIB=$(pwd)/../../target_cross
cmake -DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_INSTALL_PREFIX=$COMPILER_PREFIX \
-DCMAKE_C_COMPILER=$COMPILER_CC \
-DCMAKE_C_FLAGS="$COMPILER_FLAGS" \
-DCMAKE_CXX_COMPILER=$COMPILER_CXX \
-DCMAKE_CXX_FLAGS="$COMPILER_FLAGS" \
-DCMAKE_SYSROOT=$QL_SYSROOT \
-DCMAKE_PREFIX_PATH="$COMPILER_LIB" \
..
make
make install
会生成头文件和动态、静态库。
由于不同的编译器版本不同,可能会产生不同的问题,这里记录一个。
报错:
fecstream.c:241:9: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
问题出在 fecstream.c 文件中的for的写法,例如 for (int a; a < 10; a++),不能够正在for里面定义a。
网上针对这个问题的解决方法基本都是编译选项添加 -std=c99 或者 -std=c11。
但是这会产生另一个报错:
netsim.c:83:2: error: implicit declaration of function 'strcasecmp' [-Werror=implicit-function-declaration]
解决方案:
将 fecstream.c 中所有的在for里面定义变量的,把变量移出去到外面进行定义,不要通过添加编译选项**-std=c11** 的方式即可解决。
广告插入:
下面是一个领外卖券、打车券的公众号,如果恰有需要可以关注一下。