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静态库文件
在这里插入图片描述

发布了93 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/ljl1015ljl/article/details/103476361