犰狳:乘法时出错
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 决定标志的顺序,因此它应该将链接器标志放在正确的位置以上是关于犰狳:乘法时出错的主要内容,如果未能解决你的问题,请参考以下文章