g++可正常编译的Armadillo相关C++代码在XCode中报链接错误
XCode下Armadillo库链接错误原因与解决方案
错误根因
- 你仅为Xcode配置了Armadillo的头文件搜索路径,未配置链接阶段的依赖库:报错中缺失的
_dgeev_、_dgeevx_是LAPACK库提供的特征值计算接口符号,eig_gen函数依赖这两个接口实现。 - 命令行编译时你添加了
-larmadillo参数,默认编译的Armadillo包装库已经内置了对系统BLAS、LAPACK的依赖声明,链接器会自动关联对应系统库,因此不会报错。 - 补充测试的
ARMA_DONT_USE_WRAPPER宏作用是关闭Armadillo的包装层,直接将所有LAPACK/BLAS调用暴露给链接器,此时如果不手动添加-llapack -lblas参数,无论命令行还是Xcode都会报相同的符号未定义错误,和你观测到的现象完全吻合。
修复方案
- 方案一(推荐):在Xcode项目配置的 Build Phases -> Link Binary With Libraries 中添加
libarmadillo.dylib(默认安装路径为/usr/local/lib),作用和命令行的-larmadillo参数完全一致,无需额外修改其他配置。 - 方案二:在项目预编译宏中添加
ARMA_DONT_USE_WRAPPER,同时在 Link Binary With Libraries 中添加系统自带的Accelerate.framework,macOS的Accelerate框架内置了优化过的BLAS、LAPACK实现,可直接提供缺失的符号。
内容的提问来源于stack exchange,提问作者Stuart Barth
相关产品推荐
相关产品推荐

