-
错误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静态库文件)
前面这么说的原因,自然是因为别人导了这些头文件和库文件,但很有可能它还要依赖某些头文件和库文件,但是你有时候会找不到它到底在哪里导了,或者说有没有导这些依赖库