编译仅含特定操作的Eigen3以减小二进制体积的方法咨询
问题解答
可行性分析
完全可行。Eigen是模板头文件库,大部分代码以inline模板形式实现,仅当你在代码中实际使用某部分功能时,对应的模板才会被实例化并编译进二进制文件。只引入<Eigen/Core>(覆盖基本矩阵乘法、逐元素操作)和<Eigen/LU>(覆盖矩阵求逆,依赖PartialPivLU等分解类),确实能避免引入SVD、几何变换、稀疏矩阵等未使用模块的代码,从而显著减小最终二进制文件的体积。
CMake正确配置步骤
1. 查找Eigen依赖
Eigen无需预编译,CMake通过find_package即可定位其头文件路径:
find_package(Eigen3 REQUIRED)
如果你的系统未预装Eigen,也可以通过FetchContent直接从源码拉取(无需编译,仅获取头文件):
include(FetchContent) FetchContent_Declare( eigen GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git GIT_TAG 3.4.0 # 指定稳定版本 ) FetchContent_MakeAvailable(eigen)
2. 配置目标编译选项
在CMake中为你的目标添加Eigen头文件路径,并开启必要的编译器优化(Eigen依赖优化生成高效且紧凑的代码):
cmake_minimum_required(VERSION 3.10) project(eigen_minimal_demo) # 查找或拉取Eigen find_package(Eigen3 REQUIRED) # 若用FetchContent则替换为上面的FetchContent代码 # 创建可执行目标 add_executable(your_app main.cpp) # 引入Eigen头文件(PRIVATE确保仅当前目标可见) target_include_directories(your_app PRIVATE ${Eigen3_INCLUDE_DIRS}) # 编译器优化:减小体积+提升性能 if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(your_app PRIVATE -O2 -fvisibility=hidden) elseif(MSVC) target_compile_options(your_app PRIVATE /O2 /EHsc) endif()
3. 代码中仅引入所需头文件
确保你的源码只包含必要的Eigen头文件,示例代码:
#include <Eigen/Core> #include <Eigen/LU> int main() { // 基本矩阵乘法 Eigen::MatrixXd A(2,2); Eigen::MatrixXd B(2,2); A << 1, 2, 3, 4; B << 5, 6, 7, 8; Eigen::MatrixXd C = A * B; // 逐元素操作 Eigen::MatrixXd D = A.array() + B.array(); // 矩阵求逆(基于PartialPivLU分解) Eigen::MatrixXd A_inv = A.partialPivLu().inverse(); return 0; }
额外体积优化建议
- 启用
-Os(GCC/Clang)或/O1(MSVC):相比-O2,会优先优化文件体积而非极致性能,适合对体积敏感的场景。 - 关闭RTTI和异常:若你的项目不需要这些特性,可添加
-fno-rtti -fno-exceptions(GCC/Clang)或/GR- /EHs-c-(MSVC),进一步减小体积。
内容的提问来源于stack exchange,提问作者Sait
相关产品推荐
相关产品推荐

