犰狳:乘法时出错

Posted

技术标签:

【中文标题】犰狳:乘法时出错【英文标题】:Armadillo: error when multiplying 【发布时间】:2013-04-12 15:40:11 【问题描述】:

我在一个项目中使用犰狳,总的来说它运行良好。该项目是基于 Xcode 的,到目前为止,我设法让它工作的唯一方法是使用(添加 /usr/include/ 的标头搜索路径似乎不起作用):

#include "/usr/include/armadillo"

现在我第一次尝试做一些矩阵乘法,我做了我能想到的最简单的事情来确保没有其他原因。

mat aa = eye(3,3)*eye(3,3);

但这给了我链接器错误:

*“_wrapper_dgemm_”,引用自:

void arma::blas::gemm<double>(char const*, char const*, int const*, int const*, int const*, double const*, double const*, int const*, double const*, int const*, double const*, double*, int const*)in DynamicGridPoint.o

有人知道是什么原因造成的吗?这些示例(包括矩阵乘法)从命令行编译得很好,所以我认为这与我的 xcode 设置有关

根据目前的答案进行编辑

所以我尝试通过在项目的“其他链接器标志”中包含 -larmadillo 并将“/usr/lib”添加到标题和库搜索路径来链接到运行时库,但我收到链接错误: 'ld: 找不到 -larmadillo 的库'

对为什么会发生这种情况有任何想法吗?

/usr/lib 包含以下(相关)文件:

libarmadillo.3.80.2.dylib libarmadillo.3.dylib libarmadillo.dylib

【问题讨论】:

【参考方案1】:

您没有链接到犰狳运行时库(例如 -larmadillo)。

要解决此问题,请将 Xcode 配置为与犰狳运行时库链接,或编辑犰狳的配置使其不使用其运行时库。

后者是通过编辑“include/armadillo_bits/config.hpp”并注释掉ARMA_USE_WRAPPER来完成的。然后,您需要直接链接 lapack 和 blas(例如 -llapack -lblas),或使用 Accelerate 框架(例如 -framework Accelerate)。

【讨论】:

所以我尝试通过在项目的“其他链接器标志”中包含 -larmadillo 并将“/usr/lib”添加到标题和库搜索路径来链接到运行时库,但是我收到链接错误:'ld: library not found for -larmadillo' 关于为什么会发生这种情况的任何想法? /usr/lib 包含以下文件: libarmadillo.3.80.2.dylib libarmadillo.3.dylib libarmadillo.dylib 我现在已经成功地尝试显式链接 lapack 和 blas(使用 -llapack -lblas),但我很好奇为什么这有效而 -larmadillo 不...如果你有任何很棒的想法,但无论哪种方式,感谢您提供有效的解决方案!【参考方案2】:

您需要链接犰狳共享库。在示例中的 Makefile 中,要制定的规则是:

all: example1 example2                                                          

example1: example1.cpp  
  $(CXX) $(CXXFLAGS)  -o $@  $<  $(LIB_FLAGS) 

LIB_FLAGS 之前定义为

LIB_FLAGS = -larmadillo $(EXTRA_LIB_FLAGS)

ifeq (macos,macos)                                                              
  EXTRA_LIB_FLAGS = -framework Accelerate                                     
endif

因此,在您的 XCode 项目中,您需要找到一种包含 libarmadillo 的方法。 Accelerate 框架是可选的;我没用过。

【讨论】:

感谢您的提示 - 为什么我采取的包含 libarmadillo 的方法(请参阅问题的编辑)可能不起作用? 似乎正确......我唯一能想到的是您需要在源文件之后指定链接路径,因为某些编译器使用源文件来决定是否或不链接到指定的库。在上面的示例中,$(LIB_FLAGS) 位于 $ xcode 决定标志的顺序,因此它应该将链接器标志放在正确的位置

以上是关于犰狳:乘法时出错的主要内容,如果未能解决你的问题,请参考以下文章

犰狳:矩阵乘法精度损失

犰狳 - 矩阵乘法错误

犰狳复矩阵乘法早期逼近

犰狳向量矩阵乘法

C ++分段在进行矩阵乘法时出错

C++中的多线程矩阵乘法