如何无需构建系统或参数,用相对路径实现Eigen插件文件引入?
问题
我尝试通过#define扩展Eigen的矩阵类以适配自定义库,Eigen位于/usr/local/include目录,项目在独立文件夹中,已遵循Eigen的插件自定义规范操作。
我在名为SparseMatrix的文件中定义了扩展文件的相对路径:
#define EIGEN_MATRIXBASE_PLUGIN "src/Eigen_Extension/Matrix_Extension.hpp" #define EIGEN_SPARSEMATRIX_PLUGIN "src/Eigen_Extension/Sparse_Matrix_Extension.hpp" #include <Eigen/Core> #include <Eigen/Sparse>
使用g++ test.cpp编译时出现错误:
SparseMatrix:59:33: fatal error: src/Eigen_Extension/Matrix_Extension.hpp: No such file or directory 59 | #define EIGEN_MATRIXBASE_PLUGIN "src/Eigen_Extension/Matrix_Extension.hpp" | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated.
已知gcc会在Eigen头文件的上下文里尝试引入该路径,用绝对路径可正常编译。核心需求是:不使用构建系统或编译参数,仅通过相对路径实现插件文件的引入。
我曾尝试用__FILE__构建宏定义结构,但出现无法引入Eigen的问题。
解决方案
问题出在Eigen头文件展开时,当前路径是系统目录下的Eigen位置,而非你的项目目录,直接写相对路径会找不到文件。可以利用__FILE__宏获取当前SparseMatrix文件的绝对路径,拼接出插件的正确路径,具体实现如下:
- 先定义宏提取当前文件所在目录:
// 截取当前文件的目录路径 #define __GET_FILE_DIR__(PATH) \ (strrchr(PATH, '/') ? (strncpy((char*)alloca(strrchr(PATH, '/') - PATH + 1), PATH, strrchr(PATH, '/') - PATH + 1), (char*)alloca(strrchr(PATH, '/') - PATH + 1)) : ".") #define __FILE_DIR__ __GET_FILE_DIR__(__FILE__)
- 用目录宏拼接插件路径,替换原有的插件定义:
#define EIGEN_MATRIXBASE_PLUGIN __FILE_DIR__ "/src/Eigen_Extension/Matrix_Extension.hpp" #define EIGEN_SPARSEMATRIX_PLUGIN __FILE_DIR__ "/src/Eigen_Extension/Sparse_Matrix_Extension.hpp" #include <Eigen/Core> #include <Eigen/Sparse>
关键说明
__FILE__返回当前SparseMatrix文件的绝对路径,__GET_FILE_DIR__通过字符串操作截取文件所在目录。- 使用
alloca在栈上分配临时内存,无需手动释放,避免内存泄漏。 - 拼接后的路径是基于当前文件位置的绝对路径,Eigen头文件展开时能准确定位到插件文件。
内容的提问来源于stack exchange,提问作者Seth Wolfgang
相关产品推荐
相关产品推荐

