2013-04-12 2 views
1

Я использую armadillo для проекта, и в целом он работает хорошо. Проект Xcode на основе, и до сих пор единственным способом мне удалось заставить его работать с (добавление заголовка поиска пути/USR/включать /, кажется, не работает):Armadillo: ошибка при умножении

#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 не найдена для -larmadillo '

любые мысли о том, почему это может произойти?

/USR/Библиотека содержит следующие (соответствующие файлы):

  • 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/Библиотека содержит следующие файлы: libarmadillo.3.80.2.dylib libarmadillo.3.dylib libarmadillo.dylib – tiswas

+0

Я успешно попытался явно связываннии LAPACK и Блас (с -llapack -lblas), но Мне любопытно, почему это работает, и -larmadillo не ... если у вас есть идеи, которые были бы замечательными, но в любом случае, спасибо за рабочее решение! – tiswas

1

Вы необходимо связать общую библиотеку armadillo. В Makefile в примерах правила, чтобы сделать это:

all: example1 example2               

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

LIB_FLAGS определен ранее как

LIB_FLAGS = -larmadillo $(EXTRA_LIB_FLAGS) 

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

Так что в вашем проекте XCode вам нужно найти способ включить libarmadillo. Ракурс ускорения является необязательным; Я никогда не использовал его.

+0

спасибо за подсказку - любые идеи, почему подход, который я беру, чтобы включить libarmadillo (см. Редактирование вопроса), возможно, не работает? – tiswas

+0

Кажется правильным ...Единственное, о чем я могу думать, это то, что вам нужно указать пути ссылок _after_ исходного файла, потому что некоторые компиляторы используют исходный файл, чтобы решить, следует ли ссылаться на указанную библиотеку. В моем примере выше $ (LIB_FLAGS) появляется после $ <(который обозначает первый файл в зависимости, который является example1.cpp) – maditya

+0

xcode определяет, в каком порядке должны быть флаги, поэтому он должен помещать флаги компоновщика в правильные место – tiswas