{Ubuntu 14.04 64 bits, arm-g++ compiler 4.9
谷歌&nbspk r10c附带的一个
(我已经为平台android-14制作了一个独立的工具链,而--sysroot
指向了那个。还将标志-march=armv7-a
传递给编译器)
使用arm交叉编译器来编译boost我在socket_ops.ipp
中得到以下错误:
<1>
:
template <typename SockLenType>
inline int call_getsockname(SockLenType msghdr::*,
socket_type s, socket_addr_type* addr, std::size_t* addrlen)
{
SockLenType tmp_addrlen = (SockLenType)*addrlen;
int result = ::getsockname(s, addr, &tmp_addrlen);
*addrlen = (std::size_t)tmp_addrlen;
return result;
}
/some-path/thirdparty/boost/boost_1_55_0_Android/boost/asio/detail/impl/socket_ops.ipp:1639: error: invalid conversion from 'int*' to 'socklen_t* {aka unsigned int*}' [-fpermissive]
int result = ::getsockname(s, addr, &tmp_addrlen);
^
将行更改为:
int result = ::getsockname(s, addr, (socklen_t*)tmp_addrlen);
它汇编了很好的课程,但我不知道这是不是要做什么。
<2>
以及mapped_region.hpp
:
/some-path/thirdparty/boost/boost_1_55_0_Android/boost/interprocess/mapped_region.hpp:49: error: sys/shm.h: No such file or directory
# include <sys/shm.h> //System V shared memory...
^
并指出:
# if defined(BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS)
# include <sys/shm.h> //System V shared memory...
# endif
在该文件中。
以下是我的user-config.jam文件中的标志:
using gcc : android
:
@AndroidNDKSrcDir@/bin/arm-linux-androideabi-g++
:
<archiver>@AndroidNDKSrcDir@/bin/arm-linux-androideabi-ar
<compileflags>-fexceptions
<compileflags>-frtti
<compileflags>-fPIC
<compileflags>-std=c++11
<compileflags>-ffunction-sections
<compileflags>-funwind-tables
<compileflags>-D__ARM_ARCH_5__
<compileflags>-D__ARM_ARCH_5T__
<compileflags>-D__ARM_ARCH_5E__
<compileflags>-D__ARM_ARCH_5TE__
<compileflags>-Wno-psabi
<compileflags>-march=armv5te
<compileflags>-mtune=xscale
<compileflags>-msoft-float
<compileflags>-mthumb
<compileflags>-Os
<compileflags>-fomit-frame-pointer
<compileflags>-fno-strict-aliasing
<compileflags>-finline-limit=64
<compileflags>-I@AndroidNDKSrcDir@/include/c++/4.9
<compileflags>-Wa,--noexecstack
<compileflags>-DANDROID
<compileflags>-D__ANDROID__
<compileflags>-DNDEBUG
<compileflags>-O2
<compileflags>-g
<compileflags>-I@AndroidNDKSrcDir@/sysroot/usr/include
<architecture>arm
<compileflags>-fvisibility=hidden
<compileflags>-fvisibility-inlines-hidden
<compileflags>-fdata-sections
<cxxflags>-D__arm__
<cxxflags>-D_REENTRANT
<cxxflags>-D_GLIBCXX__PTHREADS
;
这两个错误的前进方向是什么 - &lt; 1&gt; 和&lt; 2&gt; ?升级(asio等)Android是否已准备好使用c ++ 11功能?
答案 0 :(得分:0)
&lt; 1&gt; 您有不兼容的<sys/socket.h>
和<socket_ops.ipp>
- 无论出于何种原因。您建议的“修复”将编译,但在运行时崩溃。以下是最适合您的最简单修复:
int tmp_addrlen = (int)*addrlen;
int result = ::getsockname(s, addr, &tmp_addrlen);
在Android上,LP64,这样的演员阵容不安全,但为了善良,没有人会使用超过2 ^ 32的addrlen。