CentOS7 交叉编译 ACE+TAO-6.5.13 安卓 arm64-v8a 静态库

一、环境准备

1. 基础依赖安装(CentOS 7)

bash 复制代码
yum install -y gcc gcc-c++ make unzip wget binutils

2. NDK 环境(已预置)

  • NDK 路径:/opt/android-ndk-r21e
  • 核心:NDK r21e 适配 CentOS 7,是安卓交叉编译的稳定版本

二、源码准备

1. 解压源码

bash 复制代码
# 假设压缩包在当前目录,解压到指定路径
tar -xjvf ACE+TAO-6.5.13.tar.bz2 -C /tmp/android/
# 进入 ACE 源码根目录(核心路径)
cd /tmp/android/ACE_wrappers

2. 补全安卓专属头文件(6.5.13 版本缺失)

bash 复制代码
cat > /tmp/android/ACE_wrappers/ace/os_android.h << EOF
#ifndef ACE_OS_ANDROID_H
#define ACE_OS_ANDROID_H

#include "ace/os_bsd_include.h"
#include "ace/os_linux_include.h"

#define ACE_HAS_ANDROID 1
#define ACE_HAS_LINUX 1
#define ACE_HAS_BSD 1

#define ACE_LACKS_SEM_TIMEDWAIT 1
#define ACE_LACKS_PTHREAD_RWLOCK_T 1
#define ACE_LACKS_PTHREAD_RWLOCKATTR_T 1
#define ACE_LACKS_PTHREAD_RWLOCK_INIT 1
#define ACE_LACKS_PTHREAD_RWLOCK_DESTROY 1
#define ACE_LACKS_PTHREAD_RWLOCK_LOCK 1
#define ACE_LACKS_PTHREAD_RWLOCK_UNLOCK 1
#define ACE_LACKS_PTHREAD_RWLOCK_TRYLOCK 1

#define ACE_LACKS_CLOCK_GETTIME 1
#define ACE_LACKS_CLOCK_SETTIME 1
#define ACE_LACKS_CLOCK_GETRES 1

#define ACE_HAS_POSIX_SEM 1
#define ACE_HAS_PTHREADS 1
#define ACE_HAS_SCHED_YIELD 1
#define ACE_HAS_SIGINFO_T 1

#define ACE_OS_NAME android
#define ACE_OS_VERSION ACE_ANDROID_VERSION

#define ACE_HAS_STRDUP 1
#define ACE_HAS_STRCASECMP 1
#define ACE_HAS_STRNCASECMP 1

#define ACE_LACKS_SYSV_IPC 0
#define ACE_LACKS_UNIX_DOMAIN_SOCKETS 0

#undef ACE_HAS_TLS
#define ACE_HAS_TLS 0

#endif // ACE_OS_ANDROID_H

EOF

三、交叉编译工具链生成(arm64-v8a 架构)

bash 复制代码
# 导出 NDK 路径
export ANDROID_NDK=/opt/android-ndk-r21e
# 生成 arm64-v8a 独立工具链(API 21 适配安卓 5.0+)
$ANDROID_NDK/build/tools/make_standalone_toolchain.py \
  --arch arm64 \
  --api 21 \
  --install-dir /opt/android-toolchain-arm64-v8a

# 配置工具链环境变量
export TOOLCHAIN=/opt/android-toolchain-arm64-v8a
export CC=$TOOLCHAIN/bin/aarch64-linux-android-clang
export CXX=$TOOLCHAIN/bin/aarch64-linux-android-clang++
export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
export PATH=$TOOLCHAIN/bin:$PATH

四、ACE 编译配置

1. 设置 ACE_ROOT 环境变量(关键,解决路径错误)

bash 复制代码
export ACE_ROOT=/tmp/android/ACE_wrappers

2. 创建核心配置文件

(1)ace/config.h(安卓编译核心宏)
bash 复制代码
cat > $ACE_ROOT/ace/config.h << EOF
#include "config-android.h"  // 官方安卓配置头
#define ACE_AS_STATIC_LIBS 1 // 强制静态库
#define ACE_HAS_MUTEXES 1     // 核心:启用互斥锁(ACE_Thread_Mutex依赖)
#define ACE_HAS_RECURSIVE_MUTEXES 1 // 递归锁(可选,增强兼容性)
#define ACE_HAS_THREADS 1     // 显式启用线程(避免官方配置覆盖)
#define ACE_NO_INLINE 1       // 关闭内联,确保符号导出

EOF
(2)include/makeinclude/platform_macros.GNU(编译规则)
bash 复制代码
mkdir -p $ACE_ROOT/include/makeinclude
cat > $ACE_ROOT/include/makeinclude/platform_macros.GNU << EOF
# 1. 基础编译模式(强制静态库)
static_libs=1
shared_libs=0
build_libs=1

# 2. NDK/架构/API 配置(适配 r21e)
android_ndk := /opt/android-ndk-r21e
android_api := 21
android_abi := arm64-v8a
ANDROID_ABI := $(android_abi)
CROSS_COMPILE := aarch64-linux-android

# 3. 强制指定编译器(严谨版)
CC := $(android_ndk)/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android$(android_api)-clang
CXX := $(android_ndk)/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android$(android_api)-clang++
AR := $(android_ndk)/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar  # 替换llvm-ar为原生ar(避免符号问题)
RANLIB := $(android_ndk)/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ranlib

# 4. 先定义核心宏(关键!避免被官方配置覆盖)
# 基础宏(线程/互斥锁核心)
CPPFLAGS += -DACE_HAS_THREADS=1
CPPFLAGS += -DACE_HAS_MUTEXES=1
CPPFLAGS += -DACE_HAS_RECURSIVE_MUTEXES=1
CPPFLAGS += -DACE_HAS_PTHREADS=1
CPPFLAGS += -DACE_HAS_PTHREADS_STUBS=1
# 系统兼容宏
CPPFLAGS += -DACE_HAS_ALLENGLISH=1
CPPFLAGS += -DACE_HAS_ANSI_CPP=1
CPPFLAGS += -DACE_HAS_SOCKETS=1
CPPFLAGS += -DACE_HAS_NETDB_H=1
CPPFLAGS += -DACE_HAS_ARPA_INET_H=1
CPPFLAGS += -DACE_HAS_INET_NTOP=1
CPPFLAGS += -DACE_HAS_INET_PTON=1
CPPFLAGS += -DACE_HAS_STRCASECMP=1
CPPFLAGS += -DACE_HAS_STRNCASECMP=1
CPPFLAGS += -DACE_HAS_TIME_POLICY=1
CPPFLAGS += -DACE_HAS_STANDARD_CPP_LIBRARY=1
CPPFLAGS += -DACE_USES_STD_NAMESPACE=1
CPPFLAGS += -DACE_HAS_MALLOC=1
CPPFLAGS += -DACE_HAS_MEMCPY=1
CPPFLAGS += -DACE_HAS_STRING_H=1
CPPFLAGS += -DACE_HAS_CSTRING=1
CPPFLAGS += -DACE_HAS_ITOAM=1
# NDK版本宏
CPPFLAGS += -D__NDK_MAJOR__=21 -D__NDK_MINOR__=0

# 5. 再导入官方配置(避免覆盖自定义宏)
include $(ACE_ROOT)/include/makeinclude/platform_android.GNU

# 6. 编译参数(调整C++标准+补全)
CXXFLAGS += -std=c++11  // 替换c++98为c++11(ACE 6.x+兼容更好)
CXXFLAGS += -fPIC -march=armv8-a  // PIC+armv8-a架构
CXXFLAGS += -DANDROID -D__ANDROID_API__=$(android_api)  // 显式指定安卓API
# 链接参数
LDFLAGS += -march=armv8-a -lpthread -ldl -lm -llog  // 补全llog(安卓日志库)
LIBS += -lpthread -ldl -lm -llog

EOF

五、编译 ACE 静态库

1. 仅编译核心库(跳过测试/示例,加速)

bash 复制代码
cd $ACE_ROOT
# 清理残留(可选)
make -C ace clean
# 编译核心库(-j 后接CPU核心数,如 -j4)
make -C ace -j4

2. 全量编译(可选,耗时久)

bash 复制代码
# 我这里用的是这个
cd $ACE_ROOT
make clean
make -j4

六、编译结果验证

1. 库文件位置

编译方式 libACE.a 路径
全量编译 /tmp/android/ACE_wrappers/lib//.a

2. 验证安卓架构(核心)

bash 复制代码
# 检查库架构(arm64-v8a 特征:ELF64 + AArch64)
$TOOLCHAIN/bin/aarch64-linux-android-readelf -h /tmp/android/ACE_wrappers/ace/libACE.a | grep -E "Class|Machine"
  • 正确输出:

    复制代码
    Class:                             ELF64
    Machine:                           AArch64

3. 验证安卓特征

bash 复制代码
# 确认 ACE 安卓适配宏
$TOOLCHAIN/bin/aarch64-linux-android-objdump -s /tmp/android/ACE_wrappers/ace/libACE.a | grep -i "ace_has_android"
# 输出 ACE_HAS_ANDROID=1 即验证通过

七、头文件整理(自动化脚本)

1. 创建整理脚本(整理ACE头文件.sh

bash 复制代码
#!/bin/bash
set -e
# 配置项
ACE_SRC_DIR="/tmp/android/ACE_wrappers/ace"
OUTPUT_DIR="/opt/ace-android/arm64-v8a/include"

# 创建输出目录
echo "【1/4】创建输出目录: $OUTPUT_DIR"
mkdir -p "$OUTPUT_DIR/ace"

# 仅拷贝头文件(.h/.hpp)
echo -e "\n【2/4】拷贝 ACE 头文件..."
find "$ACE_SRC_DIR" -maxdepth 1 -type f \( -name "*.h" -o -name "*.hpp" \) -exec cp {} "$OUTPUT_DIR/ace/" \;
find "$ACE_SRC_DIR" -mindepth 2 -type f \( -name "*.h" -o -name "*.hpp" \) | while read -r file; do
    target_path="$OUTPUT_DIR/ace/$(dirname "${file#$ACE_SRC_DIR/}")"
    mkdir -p "$target_path"
    cp "$file" "$target_path/"
done

# 清理冗余文件
echo -e "\n【3/4】清理冗余文件..."
find "$OUTPUT_DIR/ace" -type f ! \( -name "*.h" -o -name "*.hpp" \) -delete

# 验证核心头文件(适配 6.5.13)
echo -e "\n【4/4】验证核心头文件..."
CORE_HEADERS=(
    "$OUTPUT_DIR/ace/ACE.h"
    "$OUTPUT_DIR/ace/SOCK.h"
    "$OUTPUT_DIR/ace/Thread.h"
    "$OUTPUT_DIR/ace/os_android.h"
)
missing_headers=()
for header in "${CORE_HEADERS[@]}"; do
    if [ ! -f "$header" ]; then
        missing_headers+=("$header")
    else
        echo "✅ 存在核心头文件: $header"
    fi
done
if [ ${#missing_headers[@]} -ne 0 ]; then
    echo -e "\n❌ 缺失核心头文件: "
    for missing in "${missing_headers[@]}"; do
        echo "   $missing"
    done
    exit 1
else
    echo -e "\n🎉 ACE 头文件整理完成!"
    echo "📌 整理后路径: $OUTPUT_DIR/ace"
fi

2. 执行脚本

bash 复制代码
chmod +x 整理ACE头文件.sh
./整理ACE头文件.sh

八、最终文件整理(方便安卓项目使用)

bash 复制代码
# 创建统一目录,整合库和头文件
mkdir -p /opt/ace-android/arm64-v8a/lib
# 拷贝静态库
cp /tmp/android/ACE_wrappers/ace/libACE.a /opt/ace-android/arm64-v8a/lib/
# 头文件已通过脚本整理到 /opt/ace-android/arm64-v8a/include/ace

九、安卓项目集成(示例)

1. CMake 配置

cmake 复制代码
cmake_minimum_required(VERSION 3.10)
project(android_ace_demo)

# 引入 ACE 头文件
include_directories(/opt/ace-android/arm64-v8a/include)
# 引入 ACE 库路径
link_directories(/opt/ace-android/arm64-v8a/lib)

# 编译测试程序
add_executable(demo main.cpp)
# 链接 ACE 库及安卓系统库
target_link_libraries(demo libACE.a pthread dl)

2. Android.mk 配置

makefile 复制代码
LOCAL_C_INCLUDES += /opt/ace-android/arm64-v8a/include
LOCAL_LDLIBS += -L/opt/ace-android/arm64-v8a/lib -lACE -lpthread -ldl
LOCAL_ABI_FILTERS := arm64-v8a  # 匹配编译架构

十、其他架构编译(可选,如 armeabi-v7a)

bash 复制代码
# 生成 armeabi-v7a 工具链
$ANDROID_NDK/build/tools/make_standalone_toolchain.py \
  --arch arm \
  --api 21 \
  --install-dir /opt/android-toolchain-armeabi-v7a

# 重新配置环境变量
export TOOLCHAIN=/opt/android-toolchain-armeabi-v7a
export CC=$TOOLCHAIN/bin/arm-linux-androideabi-clang
export CXX=$TOOLCHAIN/bin/arm-linux-androideabi-clang++
export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
export LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld

# 重新编译核心库
cd $ACE_ROOT
make -C ace clean && make -C ace -j4

# 验证架构(armeabi-v7a 特征:ELF32 + ARM)
$TOOLCHAIN/bin/arm-linux-androideabi-readelf -h /tmp/android/ACE_wrappers/ace/libACE.a | grep -E "Class|Machine"

核心总结

  1. 最终可用文件:
    • 静态库:/opt/ace-android/arm64-v8a/lib/libACE.a
    • 头文件:/opt/ace-android/arm64-v8a/include/ace/
  2. 适配环境:安卓 5.0+(API 21)、arm64-v8a 架构;
  3. 关键注意:ACE 6.5.13 需手动补 os_android.h,Socket 头文件为 SOCK.h 而非 Socket.h
  4. 编译优化:用 make -C ace 仅编译核心库,避免测试用例耗时。
相关推荐
Digitally2 小时前
4种有效方法:如何将音乐从Mac传输到Android
android
CheungChunChiu2 小时前
Android 多媒体体系完整总结
android
晓13133 小时前
SQL篇——【MySQL篇:运维】高可用架构搭建(主从、读写分离、分库分表)
android·数据库·mysql
阳光的科技狗3 小时前
Android、谷歌、高通的前世今生
android·谷歌·高通
xunyan62343 小时前
面向对象(下)-接口应用:代理模式 && 工厂模式
android·java·学习
_李小白3 小时前
【Android FrameWork】第二十九天:MediaPlayer和MediaRecorder
android
casual_clover4 小时前
【Android】通过 Paint 获取文本宽度、高度及行间距信息
android·文本字体宽高
游戏开发爱好者84 小时前
苹果App Store应用程序上架方式全面指南
android·小程序·https·uni-app·iphone·webview
2501_916008894 小时前
深入理解 iPhone 文件管理,从沙盒结构到开发调试的多工具协同实践
android·ios·小程序·https·uni-app·iphone·webview