Android Studio Cmake踩坑(option 设置不生效)

本文记录了在使用Android Studio配合CMake时,option编译选项设置不生效的问题及其解决方法。对于单个ABI,需通过刷新C++项目使其生效;而对于多个ABI,可能需要删除.cxx目录并重建项目才能使设置更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Cmake的同学都喜欢用option来控制编译选项,但是我做为初玩Android Studio的新手,用cmake时候却发现option选项设置一直不生效,所以来记录下踩坑记录。

一、只编译一个abi时,option不生效

设置了一个是否使用硬编码的选项。

option(USE_HW_ENCODER "use the hw encoder" OFF)
message("USE_HW_ENCODER is ${USE_HW_ENCODER}")

Rebuild Project
.cxx/cmake/debug/arm64-v8a/build_output.txt里可以看到,没毛病

USE_HW_ENCODER is OFF
Configuring done

把选项改为ON

option(USE_HW_ENCODER "use the hw encoder" ON)
message("USE_HW_ENCODER is ${USE_HW_ENCODER}")

Rebuild Project,居然还是OFF

USE_HW_ENCODER is OFF
Configuring done

没生效,找原因,发现build下有个Refresh Linked C++ projects
点击该选项,生效了!!!

USE_HW_ENCODER is ON
Configuring done

二、多个abi版本时,option不生效

在build.gradle里加上armeabi-v7a选项,并sync

externalNativeBuild {
    cmake {
        cppFlags "-std=c++14"
        abiFilters "arm64-v8a","armeabi-v7a"
    }
}

Refresh Linked C++ projects后发现.cxx/cmake/debug/arm64-v8a/build_output.txt.cxx/cmake/debug/armeabi-v7a/build_output.txt里都输出

USE_HW_ENCODER is ON
Configuring done

没毛病

改为OFF

option(USE_HW_ENCODER "use the hw encoder" OFF)
message("USE_HW_ENCODER is ${USE_HW_ENCODER}")

Refresh Linked C++ projects 继续查看两个文件
发现arm64-v8a里是OFF,但是armeabi-v7a还是ON。
也就是说64位的设置生效了,32位的设置没生效。

Rebuild Project,发现还是这样armeabi-v7a设置没生效。
无奈直接删掉.cxx目录
Refresh Linked C++ projects 结果armeabi-v7a这个文件夹干脆没了

算了Rebuild Project试试
armeabi-v7a这个文件夹又出现了,而且设置成功了。

尝试下删掉.cxx目录直接Rebuild Project
也是一样生效的

总结

单个abi时,更改option选项后用Refresh Linked C++ projects生效
多个abi时,需要删掉.cxx目录,Rebuild Project生效

### 如何使用 CMake 编译 32 位应用程序 为了在现代操作系统上编译 32 位的应用程序,可以通过调整 CMake 的配置实现目标架构的指定。以下是具体方法: #### 设置目标架构为 32 位 CMake 支持通过环境变量或命令行参数控制生成的目标架构。对于 32 位应用程序,通常需要显式告知编译器和链接器生成适合该架构的二进制文件。 1. **Windows 平台** 在 Windows 上,可以借助 `set` 命令设置环境变量 `_MSC_VER` 或者直接传递 `-A Win32` 参数给 Visual Studio Generator 来强制生成 32 位版本的构建脚本[^2]。 使用以下命令启动 CMake 配置流程: ```bash cmake -G "Visual Studio 16 2019" -A Win32 .. ``` 2. **Linux 和 macOS 平台** 对于 Linux 和 macOS 系统,则需向编译器传递特定标志以指示其为目标 i386 架构创建代码[^4]。这可通过修改 CMAKE_C_FLAGS 和 CMAKE_CXX_FLAGS 实现: ```cmake set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") ``` 将以上两行加入到项目的根级 CMakeLists.txt 文件中即可生效[^5]。 #### 示例 CMakeLists.txt 下面展示了一个简单的例子,演示如何编写支持多平台、能够切换至不同 CPU 类型(此处指代 x86 vs x64)的 CMake 脚本: ```cmake cmake_minimum_required(VERSION 3.10) project(MyProject LANGUAGES CXX) option(BUILD_32BIT "Build a 32-bit application." OFF) if (BUILD_32BIT AND NOT WIN32) message(STATUS "Forcing build to be 32 bits.") add_definitions(-m32) elseif(WIN32 AND BUILD_32BIT) # For MSVC, ensure the correct generator is chosen. string(REPLACE "-A x64" "-A Win32" CMAKE_GENERATOR_PLATFORM ${CMAKE_GENERATOR_PLATFORM}) endif() add_executable(myapp main.cpp) target_link_libraries(myapp PRIVATE G33DDCAPI.dll) # Example library linking as per reference . ``` 此脚本允许开发者通过定义布尔选项 `BUILD_32BIT` 控制是否启用 32 位模式;当开启时会自动附加必要的编译开关。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值