2013-04-12 109 views
1

我爲一個項目使用了犰狳,而且一般情況下它一直運行良好。該項目是基於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:library not for for -larmadillo'

有關爲什麼會發生這種情況的任何想法?

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

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

回答

2

你沒有鏈接到犰狳運行時庫(例如。-larmadillo)。

要解決此問題,請將Xcode配置爲與armadillo運行時庫鏈接,或者編輯Armadillo的配置,以便它不使用其運行時庫。

後者通過編輯「include/armadillo_bits/config.hpp」並註釋掉ARMA_USE_WRAPPER來完成。然後您需要直接鏈接到lapack和blas(例如。-llapack -lblas),或使用Accelerate框架(例如。-framework Accelerate)。

+0

,所以我試圖鏈接到運行時庫,方法是在項目的「其他鏈接器標誌」中包含-larmadillo,並在頭和庫搜索路徑中添加'/ usr/lib',但出現鏈接錯誤: 'ld:找不到-larmadillo的圖書館' 關於爲什麼會發生這種情況的任何想法?/usr/lib包含以下文件: libarmadillo.3.80.2.dylib libarmadillo.3.dylib libarmadillo.dylib – tiswas

+0

我已經成功嘗試明確鏈接對拉鍊和blas(與-llapack -lblas),但我很好奇,爲什麼這個工程和-larmadillo不......如果你有任何想法,將是偉大的,但無論如何,謝謝你的工作解決方案! – tiswas

1

你需要鏈接犰狳共享庫。在Makefile中的示例中,規則,使有:

all: example1 example2               

example1: example1.cpp 
    $(CXX) $(CXXFLAGS) -o [email protected] $< $(LIB_FLAGS) 

LIB_FLAGS是Xcode項目早期定義爲

LIB_FLAGS = -larmadillo $(EXTRA_LIB_FLAGS) 

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

所以,你需要找到一種方法,包括libarmadillo。 Accelerate框架是可選的;我從來沒有用過它。

+0

感謝您的提示 - 任何想法爲什麼我採取的方法包括libarmadillo(請參閱編輯問題)可能無法正常工作? – tiswas

+0

看起來正確...我唯一能想到的就是你需要在源文件之後指定鏈接路徑,因爲有些編譯器使用源文件來決定是否鏈接到指定的庫。在我上面的例子中,$(LIB_FLAGS)出現在$ <之後(表示依賴關係中的第一個文件,即example1.cpp) – maditya

+0

xcode決定標記應該放入哪個順序,所以它應該將鏈接器標記放入正確的放置 – tiswas