Android编译时TARGET_OUT_ROOT/TARGET_OUT变量的由来

TARGET_ROOT_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_ROOT)
TARGET_COPY_OUT_ROOT := root

则首先确定 PROUDCT_OUT = $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE);
TARGET_DEVIC是我们check出来的目标设备full_xxx
TARGET_PRODUCT_OUT_ROOT= $(TARGET_OUT_ROOT)/product;
TARGET_OUT_ROOT = $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))
TARGET_BUILD_TYPE = release
则TARGET_OUT_ROOT = $(TARGET_OUT_ROOT_release)
而TARGET_OUT_ROOT_release := $(OUT_DIR)/target
则TARGET_OUT_ROOT = $(OUT_DIR)/target
一般OUT_DIR默认是out目录则可以说吗
TARGET_PRODUCT_OUT_ROOT = out/target/product
最后可以得到
PROUDCT_OUT = out/target/product/xxx/$(TARGET_COPY_OUT_ROOT)

最终可得到最终的TARGET_OUT_ROOT =  out/target/product/xxx/root/
也就是ramdisk文件系统root的所有内容,都放在这里。
一般在Android.mk中制定模块编译时的输出路径为
LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)

此外可以发现TARGET_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_SYSTEM) 且一般没有指定LOCAL_MODULE_PATH 时,模块编译输出默认到TARGET_OUT。本质就是out/target/product/xxx/system/所在,也就是打包后的system.img所在,把system镜像所在的块分区在init进程中会被挂载到root/system下面( mount ext4 /dev/block/mmcblk1p16 /system)。root根目录下部分文件链接到system内部,如etc等。

以上核心变量均在build/core/envsetup.mk中建立


cmake_minimum_required(VERSION 3.14) project(FFTW_GSL_SO LANGUAGES CXX C) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD 99) set(CMAKE_SYSTEM_NAME Android) set(CMAKE_SYSTEM_VERSION 31) # 或者您需要的 Android API 级别 set(CMAKE_ANDROID_ARCH_ABI arm64-v8a) # 设置为 arm64-v8a find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/FFTW2/HeadFile/fftw) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/GSL/HeadFile/block) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/GSL/HeadFile/gsl) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/GSL/HeadFile/interpolation) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/GSL/HeadFile/linalg) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/GSL/HeadFile/view) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/) file(GLOB FFTW2_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/FFTW2/SourceFile/fftw/*.c ) file(GLOB GSL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/GSL/SourceFile/interpolation/*.c ${CMAKE_CURRENT_SOURCE_DIR}/GSL/SourceFile/linalg/*.c ${CMAKE_CURRENT_SOURCE_DIR}/GSL/SourceFile/view/*.c ) add_library(FFTW_GSL_SO SHARED fftw_gsl_so.cpp fftw_gsl_so.h ${FFTW2_SOURCES} ${GSL_SOURCES} ) target_include_directories(FFTW_GSL_SO PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/FFTW2/HeadFile/fftw ${CMAKE_CURRENT_SOURCE_DIR}/GSL/HeadFile/block ${CMAKE_CURRENT_SOURCE_DIR}/GSL/HeadFile/gsl ${CMAKE_CURRENT_SOURCE_DIR}/GSL/HeadFile/interpolation ${CMAKE_CURRENT_SOURCE_DIR}/GSL/HeadFile/linalg ${CMAKE_CURRENT_SOURCE_DIR}/GSL/HeadFile/view ${CMAKE_CURRENT_SOURCE_DIR}/ # ${CMAKE_CURRENT_SOURCE_DIR}/GSL/SourceFile/interpolation # ${CMAKE_CURRENT_SOURCE_DIR}/GSL/SourceFile/linalg # ${CMAKE_CURRENT_SOURCE_DIR}/GSL/SourceFile/view ) target_link_libraries(FFTW_GSL_SO PRIVATE Qt${QT_VERSION_MAJOR}::Core) target_compile_definitions(FFTW_GSL_SO PRIVATE FFTW_GSL_SO_LIBRARY) 可以做我的代码上直接修正吗
最新发布
04-04
<think>好的,我需要帮助用户修正他们的CMakeLists.txt文件,以便将项目编译成Android的共享库。用户之前的问题是关于如何将GSL/FFTW2项目编译成macOS的Framework,现在他们提供了一个CMake配置,但可能存在问题,特别是针对Android平台。 首先,我需要仔细阅读用户提供的CMakeLists.txt内容,并找出其中的问题。用户提到他们想将项目编译为Android的共享库,但当前的配置可能混合了不同平台的设置,比如Qt的AUTOUIC、AUTOMOC等,这些通常用于图形界面应用,而Android项目可能不需要这些,特别是如果库不涉及Qt的GUI部分。 接下来,我需要检查CMake的版本和项目设置。用户设置了CMake最低版本为3.14,项目语言包括C++和C,这可能没问题。但设置CMAKE_SYSTEM_NAME为Android是正确的,不过需要确保使用了正确的工具链。用户可能没有指定Android工具链文件,这可能导致CMake无法正确配置交叉编译。 然后,查找Qt依赖的部分。用户使用了find_package来查找Qt Core组件,但如果是为Android编译纯共享库,可能不需要Qt,或者可能需要确保Qt被正确配置为Android版本。如果项目确实需要Qt Core,那么需要确认Qt的Android版本是否已正确安装,并且CMake能够找到对应的库和头文件。 接下来是头文件和源文件的包含。用户使用了多个include_directories,这可能可以简化为更现代的方式,使用target_include_directories。此外,GLOB收集源文件可能不是最佳实践,因为CMake不会自动检测新增文件,需要重新生成,但用户可能已经了解这一点。 在add_library部分,用户将fftw_gsl_so.cpp和.h以及FFTW和GSL的源文件添加到库中。需要确保所有源文件都是必需的,并且路径正确。同时,检查是否有平台特定的代码或依赖,特别是在Android上可能需要不同的配置。 target_link_libraries部分链接了Qt Core,同样需要确认这在Android上是否适用。如果Qt被正确配置为Android,并且库确实需要Qt Core,那么这部分没问题。否则可能需要移除Qt依赖。 用户还设置了编译定义FFTW_GSL_SO_LIBRARY,可能需要检查这个定义是否在代码中被正确使用,例如用于导出符号。 现在,我需要指出用户CMakeLists.txt中的主要问题: 1. **混合构建目标**:用户同时设置了Android系统参数(如CMAKE_SYSTEM_NAME、ARCH_ABI)和Qt的自动处理(AUTOMOC等),而Qt的移动端构建需要特定的配置,特别是Android可能需要使用androiddeployqt工具,但用户的配置中没有相关设置。 2. **Qt依赖问题**:如果项目不需要Qt GUI部分,引入Qt Core可能没有必要。如果确实需要,必须确保Qt被正确配置为Android版本,并且find_package能够找到对应的库。 3. **工具链配置缺失**:Android交叉编译通常需要指定工具链文件,例如使用-DCMAKE_TOOLCHAIN_FILE参数指向Android NDK的CMake工具链文件。用户当前的配置中没有指定,这可能导致CMake无法正确识别编译器和目标平台。 4. **头文件包含冗余**:用户多次添加了包含路径,包括当前源目录,可能可以简化。同时,FFTW和GSL的头文件路径是否正确?可能需要验证这些路径是否在Android NDK中存在或需要交叉编译。 5. **符号导出与可见性**:在之前的回答中提到了使用FFTW_GSL_EXPORT宏来处理符号导出,但在当前的CMake配置中没有相关设置,可能导致动态库的符号不可见。 6. **C++标准设置**:用户设置了C++11和C99标准,这在Android上通常是支持的,但需要确认NDK的版本是否支持这些标准。 7. **源文件收集方式**:使用file(GLOB)可能会在添加新文件时导致问题,建议显式列出源文件,或者用户确认接受这种风险。 基于以上分析,我需要为用户提供一个修正后的CMakeLists.txt,解决上述问题,并添加必要的Android配置,例如工具链文件、移除不必要的Qt依赖(或正确配置Qt for Android),确保头文件和源文件路径正确,处理符号导出,以及可能的其他优化。 此外,用户可能需要安装Android NDK,并配置CMake使用NDK的工具链文件。如果用户确实需要Qt,可能需要使用Qt for Android的套件,并确保所有依赖库都针对Android架构(如arm64-v8a)进行了交叉编译。</think>以下是对您CMakeLists.txt的修正方案及详细说明: ```cmake # 基础配置修正版 cmake_minimum_required(VERSION 3.21) # 提升版本以更好支持Android project(FFTW_GSL_SO LANGUAGES C CXX) #-------------------------- # Android 专属配置 #-------------------------- set(CMAKE_SYSTEM_NAME Android) set(CMAKE_SYSTEM_VERSION 31) # Android API级别 set(CMAKE_ANDROID_ARCH_ABI arm64-v8a) # 目标架构 set(CMAKE_ANDROID_NDK $ENV{ANDROID_NDK_HOME}) # 需要设置环境变量 #-------------------------- # 移除不必要的Qt配置(除非明确需要Qt Core) #-------------------------- # 删除以下内容: # set(CMAKE_AUTOUIC ON) # set(CMAKE_AUTOMOC ON) # set(CMAKE_AUTORCC ON) # find_package(QT...) # target_link_libraries(Qt...) #-------------------------- # 标准配置 #-------------------------- set(CMAKE_C_STANDARD 99) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_C_VISIBILITY_PRESET hidden) # 符号隐藏 set(CMAKE_CXX_VISIBILITY_PRESET hidden) #-------------------------- # 头文件配置(现代写法) #-------------------------- target_include_directories(FFTW_GSL_SO BEFORE PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/FFTW2/HeadFile/fftw ${CMAKE_CURRENT_SOURCE_DIR}/GSL/HeadFile ${CMAKE_CURRENT_SOURCE_DIR} # 根目录头文件 ) #-------------------------- # 源文件收集(建议显式列出) #-------------------------- set(FFTW2_SOURCES FFTW2/SourceFile/fftw/api.c FFTW2/SourceFile/fftw/conf.c # 其他fftw源文件... ) set(GSL_SOURCES GSL/SourceFile/interpolation/akima.c GSL/SourceFile/linalg/bidiag.c # 其他gsl源文件... ) #-------------------------- # 动态库配置 #-------------------------- add_library(FFTW_GSL_SO SHARED fftw_gsl_so.cpp fftw_gsl_so.h ${FFTW2_SOURCES} ${GSL_SOURCES} ) #-------------------------- # 符号导出配置(关键修正) #-------------------------- # 在代码中使用 __attribute__((visibility("default"))) target_compile_definitions(FFTW_GSL_SO PRIVATE FFTW_GSL_SO_EXPORTS # 自动生成导出标记 ) #-------------------------- # 依赖管理(需提前交叉编译好) #-------------------------- # 假设已通过交叉编译安装到以下路径 set(FFTW_ROOT "${CMAKE_SOURCE_DIR}/../android-deps/fftw3/arm64-v8a") set(GSL_ROOT "${CMAKE_SOURCE_DIR}/../android-deps/gsl/arm64-v8a") target_link_directories(FFTW_GSL_SO PRIVATE ${FFTW_ROOT}/lib ${GSL_ROOT}/lib ) target_link_libraries(FFTW_GSL_SO PRIVATE fftw3 gsl ) #-------------------------- # Android特定优化 #-------------------------- set_target_properties(FFTW_GSL_SO PROPERTIES ANDROID_ARM_NEON TRUE ANDROID_STL c++_shared ) ``` 主要修正点说明: 1. **Android工具链配置**: - 必须设置`ANDROID_NDK_HOME`环境变量 - 建议使用NDK r23+自带的CMake工具链文件(需通过`-DCMAKE_TOOLCHAIN_FILE`指定) 2. **Qt配置清理**: - 除非项目确实需要Qt Core功能,否则移除所有Qt相关配置 - 若确实需要Qt,应使用针对Android交叉编译的Qt版本 3. **符号导出改进**: - 添加`FFTW_GSL_SO_EXPORTS`编译定义 - 在代码头文件中应添加: ```cpp #if defined(_WIN32) || defined(__CYGWIN__) #ifdef FFTW_GSL_SO_EXPORTS #define FFTW_GSL_API __declspec(dllexport) #else #define FFTW_GSL_API __declspec(dllimport) #endif #else #ifdef FFTW_GSL_SO_EXPORTS #define FFTW_GSL_API __attribute__((visibility("default"))) #else #define FFTW_GSL_API #endif #endif ``` 4. **依赖管理调整**: - FFTW/GSL需要预先用Android NDK交叉编译 - 推荐使用独立预编译库(.a或.so) 编译命令建议: ```bash # 需提前设置NDK路径 export ANDROID_NDK_HOME=/path/to/ndk cmake -B build \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-31 cmake --build build ``` 补充建议: 1. 建议将FFTW/GSL作为子模块(submodule)管理 2. 在项目根目录添加`CMakeLists.txt`组织子目录 3. 为Android构建添加专用的toolchain文件 4. 使用ccache加速编译: ```cmake find_program(CCACHE_PROGRAM ccache) if(CCACHE_PROGRAM) set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM}) set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM}) endif() ``` 完整项目结构建议: ``` . ├── android-deps/ # 预编译的Android依赖库 │ ├── fftw3/ │ └── gsl/ ├── CMakeLists.txt # 主构建文件 ├── FFTW2/ │ ├── HeadFile/ │ └── SourceFile/ ├── GSL/ │ ├── HeadFile/ │ └── SourceFile/ └── src/ ├── fftw_gsl_so.cpp └── fftw_gsl_so.h ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值