orbslam移植ios------cholmod一系列问题解决11

  • 错误1
    Undefined symbols for architecture x86_64:
    “_jpeg_free_large”, referenced from:
    _free_pool in opencv2(jmemmgr.o)
    “_jpeg_free_small”, referenced from:
    _free_pool in opencv2(jmemmgr.o)
    _self_destruct in opencv2(jmemmgr.o)
    “_jpeg_get_large”, referenced from:
    _alloc_large in opencv2(jmemmgr.o)
    _alloc_barray in opencv2(jmemmgr.o)
    “_jpeg_get_small”, referenced from:
    _jinit_memory_mgr in opencv2(jmemmgr.o)
    _alloc_small in opencv2(jmemmgr.o)
    “_jpeg_mem_available”, referenced from:
    _realize_virt_arrays in opencv2(jmemmgr.o)
    “_jpeg_mem_init”, referenced from:
    _jinit_memory_mgr in opencv2(jmemmgr.o)
    “_jpeg_mem_term”, referenced from:
    _jinit_memory_mgr in opencv2(jmemmgr.o)
    _self_destruct in opencv2(jmemmgr.o)
    “_jpeg_open_backing_store”, referenced from:
    _realize_virt_arrays in opencv2(jmemmgr.o)
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

    解决办法:
    安装:libjpeg-turbo.dmg : https://sourceforge.net/projects/libjpeg-turbo/files/1.4.0/
    在终端运行:lipo -info /opt/libjpeg-turbo/lib/libjpeg.a 将会出现以下内容:
    Architectures in the fat file: /opt/libjpeg-turbo/lib/libjpeg.a are: i386 x86_64 armv6 armv7 armv7s arm64
    然后将/opt/libjpeg-turbo/lib/libjpeg.a 加到你的工程里面

  • 错误2
    Undefined symbols for architecture arm64:
    zherk”, referenced from:
    _cholmod_super_numeric in libcholmod.a(cholmod_super_numeric.o)
    zpotrf”, referenced from:
    _cholmod_super_numeric in libcholmod.a(cholmod_super_numeric.o)
    dsyrk”, referenced from:
    _cholmod_super_numeric in libcholmod.a(cholmod_super_numeric.o)
    dpotrf”, referenced from:
    _cholmod_super_numeric in libcholmod.a(cholmod_super_numeric.o)
    ztrsv”, referenced from:
    _cholmod_super_lsolve in libcholmod.a(cholmod_super_solve.o)
    _cholmod_super_ltsolve in libcholmod.a(cholmod_super_solve.o)
    zgemv”, referenced from:
    _cholmod_super_lsolve in libcholmod.a(cholmod_super_solve.o)
    _cholmod_super_ltsolve in libcholmod.a(cholmod_super_solve.o)
    dtrsv”, referenced from:
    _cholmod_super_lsolve in libcholmod.a(cholmod_super_solve.o)
    _cholmod_super_ltsolve in libcholmod.a(cholmod_super_solve.o)
    dgemv”, referenced from:
    _cholmod_super_lsolve in libcholmod.a(cholmod_super_solve.o)
    _cholmod_super_ltsolve in libcholmod.a(cholmod_super_solve.o)
    “VIO::VIO()”, referenced from:
    ___cxx_global_var_init.10 in ViewController.o
    ztrsm”, referenced from:
    _cholmod_super_lsolve in libcholmod.a(cholmod_super_solve.o)
    _cholmod_super_ltsolve in libcholmod.a(cholmod_super_solve.o)
    _cholmod_super_numeric in libcholmod.a(cholmod_super_numeric.o)
    zgemm”, referenced from:
    _cholmod_super_lsolve in libcholmod.a(cholmod_super_solve.o)
    _cholmod_super_ltsolve in libcholmod.a(cholmod_super_solve.o)
    _cholmod_super_numeric in libcholmod.a(cholmod_super_numeric.o)
    dtrsm”, referenced from:
    _cholmod_super_lsolve in libcholmod.a(cholmod_super_solve.o)
    _cholmod_super_ltsolve in libcholmod.a(cholmod_super_solve.o)
    _cholmod_super_numeric in libcholmod.a(cholmod_super_numeric.o)
    dgemm”, referenced from:
    _cholmod_super_lsolve in libcholmod.a(cholmod_super_solve.o)
    _cholmod_super_ltsolve in libcholmod.a(cholmod_super_solve.o)
    _cholmod_super_numeric in libcholmod.a(cholmod_super_numeric.o)
    ld: symbol(s) not found for architecture arm64

    解决办法:由报错第一行可以判定该报错与Cholmod库有关。无法正确链接Cholmod库。而Cholmod库最终是用的suitesparse库里的
    brew install suite-sparse
    然后在Header Search Paths 和Library Search Paths里添加suitesparse include和lib路径
    后面还是会有这个错,是因为一开始编译g2o的时候,就没真正编译好,重新把suitesparse也导入到g2o工程里,编译生成g2o.a就好了

  • 错误3
    Undefined symbols for architecture arm64:
    “_cholmod_analyze”, referenced from:
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::computeSymbolicDecomposition(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::computeSymbolicDecomposition(g2o::SparseBlockMatrix<Eigen::Matrix<double, 6, 6, 0, 6, 6> > const&) in Optimizer.o
    “_cholmod_amd”, referenced from:
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::computeSymbolicDecomposition(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::computeSymbolicDecomposition(g2o::SparseBlockMatrix<Eigen::Matrix<double, 6, 6, 0, 6, 6> > const&) in Optimizer.o
    “_cholmod_factorize”, referenced from:
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solve(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double*, double*) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solveBlocks(double**&, g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solvePattern(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, std::__1::vector<std::__1::pair<int, int>, std::__1::allocator<std::__1::pair<int, int> > > const&, g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::solve(g2o::SparseBlockMatrix<Eigen::Matrix<double, 6, 6, 0, 6, 6> > const&, double*, double*) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::solveBlocks(double**&, g2o::SparseBlockMatrix<Eigen::Matrix<double, 6, 6, 0, 6, 6> > const&) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::solvePattern(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, std::__1::vector<std::__1::pair<int, int>, std::__1::allocator<std::__1::pair<int, int> > > const&, g2o::SparseBlockMatrix<Eigen::Matrix<double, 6, 6, 0, 6, 6> > const&) in Optimizer.o
    “_cholmod_change_factor”, referenced from:
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solveBlocks(double**&, g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solvePattern(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, std::__1::vector<std::__1::pair<int, int>, std::__1::allocator<std::__1::pair<int, int> > > const&, g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::solveBlocks(double**&, g2o::SparseBlockMatrix<Eigen::Matrix<double, 6, 6, 0, 6, 6> > const&) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::solvePattern(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, std::__1::vector<std::__1::pair<int, int>, std::__1::allocator<std::__1::pair<int, int> > > const&, g2o::SparseBlockMatrix<Eigen::Matrix<double, 6, 6, 0, 6, 6> > const&) in Optimizer.o
    “_cholmod_free_factor”, referenced from:
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::init() in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::~LinearSolverCholmod() in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::init() in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::~LinearSolverCholmod() in Optimizer.o
    “_cholmod_solve”, referenced from:
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solve(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double*, double*) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::solve(g2o::SparseBlockMatrix<Eigen::Matrix<double, 6, 6, 0, 6, 6> > const&, double*, double*) in Optimizer.o
    “_cholmod_free_dense”, referenced from:
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solve(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double*, double*) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::solve(g2o::SparseBlockMatrix<Eigen::Matrix<double, 6, 6, 0, 6, 6> > const&, double*, double*) in Optimizer.o
    “_cholmod_start”, referenced from:
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::LinearSolverCholmod() in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::LinearSolverCholmod() in Optimizer.o
    “_cholmod_analyze_p”, referenced from:
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::computeSymbolicDecomposition(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&) in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::computeSymbolicDecomposition(g2o::SparseBlockMatrix<Eigen::Matrix<double, 6, 6, 0, 6, 6> > const&) in Optimizer.o
    “_cholmod_finish”, referenced from:
    g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::~LinearSolverCholmod() in Optimizer.o
    g2o::LinearSolverCholmod<Eigen::Matrix<double, 6, 6, 0, 6, 6> >::~LinearSolverCholmod() in Optimizer.o
    “VIO::VIO()”, referenced from:
    ___cxx_global_var_init.10 in ViewController.o
    ld: symbol(s) not found for architecture arm64

后来发现,链接的库还是有问题
最终是自己去网上找了suitesparse源码,然后编译,这样模拟器就可以编译通过了
不要直接在别人的代码里直接找cholmod的头文件和库文件,这样很容易出问题(当然可以直接先这样尝试,如果报某个包相关的错误,那么就应该去网上找源码,然后自己按照官网编译即可,此时可能会出现模拟器编译通过,但ios真机编译失败,而且生成的总是dylib,没有.a静态库文件,此时就是编译的方式换一换,一般是修改CMakeLists.txt,同时生成dylib和.a静态库文件)

前面这么说的原因,自然是因为别人导了这些头文件和库文件,但很有可能它还要依赖某些头文件和库文件,但是你有时候会找不到它到底在哪里导了,或者说有没有导这些依赖库

通过CMakeLists.txt生成.a静态库文件
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
opengles是一种用于在移动设备和嵌入式系统上实现2D和3D图形渲染的图形库。而gl-transitions是一个开源的OpenGL库,用于创建平滑过渡效果,可以应用于图像、视频等多种媒体内容。 要将gl-transitions移植到opengles上,需要进行以下步骤: 1. 确定opengles版本:gl-transitions可能使用的是OpenGL的较新版本,而opengles可能只支持较旧的版本。因此,首先需要确定opengles版本,并了解其与OpenGL之间的差异。 2. 了解gl-transitions的实现:深入了解gl-transitions的实现方式和代码结构,理解其对OpenGL的使用方式和功能。 3. 理解opengles的API:熟悉opengles的API,包括顶点/片段着色器、缓冲区对象、纹理对象等。理解opengles的渲染管线和数据传递方式,以便能够正确地将gl-transitions移植到opengles上。 4. 逐步移植:根据gl-transitions的实现和opengles的API,逐步将gl-transitions的代码移植为opengles可用的代码。这可能涉及到对着色器代码的修改、纹理对象的创建和绑定、缓冲区对象的使用等。 5. 调试和测试:移植完成后,进行调试和测试以确保移植后的代码在opengles上正常工作,并且能够正确地渲染出所需的过渡效果。 需要注意的是,由于较新版本的OpenGL可能具有一些opengles不支持的功能,因此在移植过程中可能需要做一些功能的调整或替代。此外,移植过程中可能还需要考虑设备的性能和兼容性问题,确保移植后的代码能够在目标设备上流畅地运行。 总结起来,将gl-transitions移植到opengles上需要对opengles的API有很好的了解,并根据它的渲染方式和数据传递方式对gl-transitions的代码进行适当的修改和调整。这样才能确保移植后的代码能够在opengles上正常运行并呈现出所需的过渡效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值