首页 > 解决方案 > 在 MacOS Mojave 10.14.2 上使用 levmar 库会导致编译错误

问题描述

我想在 MacOS X Mojave 上使用 levmar 库。为了编译库,我必须首先编译没有错误的 f2c 库,然后使用它通过 cmake 编译 levmar 库。所有这些编译都没有错误,并且创建的示例演示程序“lmdemo”实际运行。但是,当我尝试使用 g++ 编译 expfit.c 示例(随 levmar 下载提供)时,出现错误:

架构 x86_64 的未定义符号:“ dgemm ”,引用自:liblevmar.a(misc.co) 中的 _dlevmar_trans_mat_mat_mult “ dgeqrf ”,引用自:liblevmar.a(Axb.co) 中的_dAx_eq_b_QR liblevmar.a(Axb.co) 中的_dAx_eq_b_QRLS “ dgesvd ”,引用自:liblevmar.a(Axb.co) 中的_dAx_eq_b_SVD liblevmar.a(misc.co) 中的_dlevmar_pseudoinverse “ dgetrf ”,引用自:liblevmar.a(Axb.co) 中的_dAx_eq_b_LU “ dgetrs ”,引用自: _dAx_eq_b_LU in liblevmar.a(Axb.co) " dorgqr ", 引用自: _dAx_eq_b_QR in liblevmar.a(Axb.co) " dpotf2",引用自:liblevmar.a(misc.co) 中的 _dlevmar_chol " dpotrf ",引用自:liblevmar.a(Axb.co) 中的 _dAx_eq_b_Chol" dpotrs ",引用自:liblevmar.a(Axb.co) 中的 _dAx_eq_b_Chol" dsytrf ",引用自:liblevmar.a(Axb.co) 中的 _dAx_eq_b_BK" dsytrs ",引用自:liblevmar.a(Axb.co) 中的_dAx_eq_b_BK " dtrtrs ",引用自:liblevmar.a(Axb.co) 中的_dAx_eq_b_QR liblevmar.a(Axb.co)“ sgemm ”中的_dAx_eq_b_QRLS,引用自:liblevmar.a(misc.co)中的_slevmar_trans_mat_mat_mult“ sgeqrf",引用自:liblevmar.a(Axb.co) 中的 _sAx_eq_b_QR,liblevmar.a(Axb.co) 中的 _sAx_eq_b_QRLS “ sgesvd ”,引用自:liblevmar.a(Axb.co) 中的 _sAx_eq_b_SVD _slevmar_pseudoinverse 在 liblevmar.a(misc. co) “ sgetrf ”,引用自:liblevmar.a(Axb.co) 中的_sAx_eq_b_LU “ sgetrs ”,引用自:liblevmar.a(Axb.co) 中的_sAx_eq_b_LU “ sorgqr ”,引用自:liblevmar.a(Axb)中的_sAx_eq_b_QR .co) “ spotf2 ”,引用自:liblevmar.a(misc.co) 中的 _slevmar_chol “ spotrf ”,引用自:liblevmar.a(Axb.co) 中的 _sAx_eq_b_Chol “ spotrs",引用自:liblevmar.a(Axb.co) 中的_sAx_eq_b_Chol " ssytrf ",引用自:liblevmar.a(Axb.co) 中的_sAx_eq_b_BK" ssytrs ",引用自:liblevmar.a(Axb.co) 中的_sAx_eq_b_BK" strtrs ",引用自:liblevmar.a(Axb.co) 中的 _sAx_eq_b_QR liblevmar.a(Axb.co) 中的 _sAx_eq_b_QRLS ld:未找到架构 x86_64 的符号 clang:错误:链接器命令失败,退出代码为 1(使用-v 查看调用)

这些似乎来自 BLAS/LAPACK 例程,不是吗?'lmdemo' 示例如何运行良好?

g++ 编译器为 -v 选项提供了这个结果:

配置: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ MacOSX10.14.sdk/usr/include/c++/4.2.1 Apple LLVM 版本 10.0.0 (clang-1000.11.45.5) 目标:x86_64-apple-darwin18.2.0 线程模型:posix InstalledDir: /Applications/Xcode.app/目录/开发者/工具链/XcodeDefault.xctoolchain/usr/bin

谷歌搜索问题并使用 xcode-select --install 的解决方案没有解决问题。

任何人都可以帮助我吗?谢谢Z

标签: g++clang++macos-mojave

解决方案


好的,所以似乎在编译时链接 levmar (-llevmar) 库以及 BLAS 和 LAPACK 库 (-lblas -llapack) 是不够的。添加这些链接后,示例 expfit.c 将按预期编译和运行。我不确定我是否理解这一点,因为程序 expfit.c 不直接使用任何只有 levmar 的 blas 或 lapack 例程。这是否意味着 levmar 是在没有 blas 或 lapack 的情况下编译的?嗯……


推荐阅读