为 Intel Edison 交叉编译 portAudio

Cross compiling portAudio for Intel Edison

我正在使用 Intel Site 中的交叉编译环境,并使用它成功编译了其他几个库(libsndfile、alsa、fftw),但是当我尝试编译 portaudio 时,它拒绝 link到正确的目录。这是我得到的错误:

if test -n " bindings/cpp" ; then for dir in " bindings/cpp"; do make -C $dir all; done ; fi
make[1]: Entering directory '/home/theslat/Downloads/portaudio/bindings/cpp'
Making all in lib
make[2]: Entering directory '/home/theslat/Downloads/portaudio/bindings/cpp/lib'
/bin/sh ../libtool --tag=CXX   --mode=link i586-poky-linux-g++  -m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -mstackrealign -fno-omit-frame-pointer --sysroot=/usr/edison/sysroots/core2-32-poky-linux  -O2 -pipe -g -feliminate-unused-debug-types -version-info 0:12:0 -no-undefined -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -o libportaudiocpp.la -rpath /usr/local/lib BlockingStream.lo CallbackInterface.lo CallbackStream.lo CFunCallbackStream.lo CppFunCallbackStream.lo Device.lo DirectionSpecificStreamParameters.lo Exception.lo HostApi.lo InterfaceCallbackStream.lo MemFunCallbackStream.lo Stream.lo StreamParameters.lo System.lo SystemDeviceIterator.lo SystemHostApiIterator.lo ../../../lib/libportaudio.la 
libtool: link: i586-poky-linux-g++  -m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -mstackrealign -fno-omit-frame-pointer --sysroot=/usr/edison/sysroots/core2-32-poky-linux  -fPIC -DPIC -shared -nostdlib /usr/edison/sysroots/core2-32-poky-linux/usr/lib/crti.o /usr/edison/sysroots/core2-32-poky-linux/usr/lib/i586-poky-linux/4.9.1/crtbeginS.o  .libs/BlockingStream.o .libs/CallbackInterface.o .libs/CallbackStream.o .libs/CFunCallbackStream.o .libs/CppFunCallbackStream.o .libs/Device.o .libs/DirectionSpecificStreamParameters.o .libs/Exception.o .libs/HostApi.o .libs/InterfaceCallbackStream.o .libs/MemFunCallbackStream.o .libs/Stream.o .libs/StreamParameters.o .libs/System.o .libs/SystemDeviceIterator.o .libs/SystemHostApiIterator.o   -Wl,-rpath -Wl,/home/theslat/Downloads/portaudio/lib/.libs -Wl,-rpath -Wl,/usr/local/lib ../../../lib/.libs/libportaudio.so -L/usr/edison/sysroots/x86_64-pokysdk-linux/usr/bin/i586-poky-linux/../../lib/i586-poky-linux/gcc/i586-poky-linux/4.9.1 -L/usr/edison/sysroots/x86_64-pokysdk-linux/usr/bin/i586-poky-linux/../../lib/i586-poky-linux/gcc -L/usr/edison/sysroots/core2-32-poky-linux/lib -L/usr/edison/sysroots/core2-32-poky-linux/usr/lib/i586-poky-linux/4.9.1 -L/usr/edison/sysroots/core2-32-poky-linux/usr/lib /usr/lib/libstdc++.so -lm -lc -lgcc_s /usr/edison/sysroots/core2-32-poky-linux/usr/lib/i586-poky-linux/4.9.1/crtendS.o /usr/edison/sysroots/core2-32-poky-linux/usr/lib/crtn.o  -m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -mstackrealign --sysroot=/usr/edison/sysroots/core2-32-poky-linux -O2 -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed   -Wl,-soname -Wl,libportaudiocpp.so.0 -o .libs/libportaudiocpp.so.0.0.12
/usr/lib/libstdc++.so: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:311: libportaudiocpp.la] Error 1
make[2]: Leaving directory '/home/theslat/Downloads/portaudio/bindings/cpp/lib'
make[1]: *** [Makefile:333: all-recursive] Error 1
make[1]: Leaving directory '/home/theslat/Downloads/portaudio/bindings/cpp'
make: *** [Makefile:251: all-recursive] Error 2

它似乎正试图 link 针对我的计算机正常的 libstdc++,我不知道为什么。我已经尝试输入 configure 具有正确目录的各种 LDFLAG,并重新安装了工具链和我所有的多库,但没有成功。

我很惊讶没有人抓住这个,而且尽管看到许多其他人有类似(未解决的问题),但很难在其他地方找到正确的答案。坦率地说,答案很简单,我很尴尬,以至于我忽略了它,但在这里,也许其他人可以找到它。

make install 如果交叉编译 SDK 在 /opt 或您不拥有的其他地方,则需要 root 权限。但是... sudo 不会保留我为工具链设置的环境变量!很简单,su -m 也不像我想象的那样工作。工作解决方案如下:

  1. 只需将 SDK 安装在您的主目录中的某个位置。您现在拥有写入权限,问题已解决。
  2. 运行 在保护环境的同时以 root 身份执行单个命令:su -m <yourUserName> -c '$CC main.cpp -lfoo -lbar ...'

数字 2 中的关键是 -m 之后的用户名,至少在我的系统上,省略用户名不会产生错误,但无法保护我的环境。

我也 运行 遇到这个问题,最简单的方法是在同一命令行上执行 sudo su 后再次获取环境文件,然后执行 make install。

以下是我为 intel edison 交叉编译 portaudio 所遵循的步骤:

  1. 从这里下载交叉编译器edison-toolchain-20150120-linux64.tar.bz2和脚本toolchain-20140724-linux64.shlink

  2. 提取工具链,运行脚本(如果你愿意,你可以把它放在你的主目录的某个地方)并设置交叉编译环境

$ tar -xvf edison-toolchain-20150120-linux64.tar.bz2   
$ chmod +x toolchain-20140724-linux64.sh   
$ ./toolchain-20140724-linux64.sh  
$ source /opt/poky-edison/1.6/environment-setup-core2-32-poky-linux
  1. 检查 shell 上的环境:
$ echo $CC  
$ i586-poky-linux-gcc -m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -mstackrealign -fno-omit-frame-pointer --sysroot=/opt/poky-edison/1.6/sysroots/core2-32-poky-linux

配置、编译和安装portaudio:

$ ./configure
$ make
$ sudo su
# source /opt/poky-edison/1.6/environment-setup-core2-32-poky-linux
# make install