tensorflow编译和Eigen3不兼容报错解决 -- error: the value of ‘j’ is not usable in a constant expression

本文解决在编译TensorFlow 1.13.1动态库过程中遇到的“the value of ‘j’ is not usable in a constant expression”错误。通过下载并手动安装Eigen 3.3.7版本,调整Makefile的include路径,成功解决了编译问题。
部署运行你感兴趣的模型镜像

编译tensorflow动态库的过程真的是万分曲折,版本搭配不对就会出错,报错信息如下:

error: the value of ‘j’ is not usable in a constant expression

定位到是Eigen3的问题,tensorflow版本是1.13.1,一般来说当需要安装第三方包的时候就在tensorflow/workspace.bzl中找类似下面的内容,然后按照连接下载即可,但是这次我用这个方法还是不行。

  tf_http_archive(
        name = "eigen_archive",
        build_file = clean_dep("//third_party:eigen.BUILD"),
        sha256 = "753fbb58d0a49b6bcbcfb126ebfa2e21fc97f7471529ba835a096008ce588d8a",
        strip_prefix = "eigen-eigen-9f48e814419e",
        urls = [
            "https://mirror.bazel.build/bitbucket.org/eigen/eigen/get/9f48e814419e.tar.gz",
            "https://bitbucket.org/eigen/eigen/get/9f48e814419e.tar.gz",
        ],

最终在github上看到了一句话 https://github.com/tensorflow/tensorflow/issues/29927

I had the same issue
I resolved it by manually downloading the eigen v 3.3.7 (last stable)

按照这里说的下载Eigen3.3.7版本源码,在源码目录中执行下面的命令

mkdir build
cd build
cmake ..
sudo make install

然后把/usr/local/include/eigen3加入Makefile的include路径即可解决编译tensorflow1.13.1中的报错。

另外可以在Eigen/src/Core/util/Macros.h 查看Eigen的版本号。

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

这个错误通常表示在需要常量表达式的上下文中使用了非常量的值。结合参考内容可知,在模板编程、矩阵操作以及 `switch` 语句的 `case` 标签等场景中都可能出现类似错误,以下是具体的解决思路示例: ### 模板编程场景 在模板编程里,模板参数要求是常量表达式。若模板参数使用了非常量变量,就会引发此错误。例如: ```cpp template<class T, int c> struct MyStruct { }; int main() { int c = 5; // 错误:c 不是常量表达式 // MyStruct<int, c> obj; // 注释掉这行避免编译错误 // 解决方法:使用常量 const int constant_c = 5; MyStruct<int, constant_c> obj; return 0; } ``` 此示例中,模板 `MyStruct` 的第二个参数需要常量表达式。初始时,变量 `c` 为非常量,无法用作模板参数,将其改为常量 `constant_c` 就能解决问题 [^1]。 ### 矩阵操作场景 在使用矩阵库(如 Eigen)时,某些方法的模板参数也得是常量表达式。例如: ```cpp #include <Eigen/Dense> #include <iostream> int main() { Eigen::MatrixXd R(10, 10); int blk = 3; int blk2 = 2; // 错误:blk2 blk 不是常量表达式 // Eigen::MatrixXd R_fp = R.block<blk2, blk>(0, 0); // 注释掉这行避免编译错误 // 解决方法:使用常量 const int constant_blk = 3; const int constant_blk2 = 2; Eigen::MatrixXd R_fp = R.block<constant_blk2, constant_blk>(0, 0); return 0; } ``` 在这个例子中,`Eigen` 库的 `block` 方法模板参数要求是常量表达式。将变量 `blk` `blk2` 改为常量 `constant_blk` `constant_blk2` 即可解决问题 [^2]。 ### `switch` 语句场景 在 `switch` 语句的 `case` 标签中,值必须是常量表达式。若使用了非常量值,就会报错。例如: ```cpp int main() { int c = 5; int value = 1; // 错误:c 不是常量表达式 // switch (value) { // case c: // std::cout << "Matched c" << std::endl; // break; // } // 解决方法:使用常量 const int constant_c = 5; switch (value) { case constant_c: std::cout << "Matched constant_c" << std::endl; break; } return 0; } ``` 此示例中,`switch` 语句的 `case` 标签要求是常量表达式。将变量 `c` 改为常量 `constant_c` 就能解决问题 [^4]。 ### 总结 解决 `the value of &#39;c&#39; is not usable in a constant expression` 错误的通用方法是保证在需要常量表达式的地方使用常量。若无法使用常量,可能需要调整代码逻辑,避免在这些场景使用模板参数或 `case` 标签。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值