Я пытаюсь сделать a repository сбор всех примеров, руководств и инструкций, которые я смог найти в Интернете для библиотек математики и алгебры C (BLAS, CBLAS, LAPACK, CLAPACK, LAPACKE , ATLAS, openblas, GSL ...). но мне кажется, что я просто не могу получить скомпилированного Блас .а файлов, работающих на Mac OS X.Невозможно использовать скомпилированный netlib BLAS на Mac OS X
До сих пор я был в состоянии собрать BLAS и использовать его на убунту:
- BLAS исходного кода с веб-сайта Netlib загружены и скомпилированы (переименовать blas_LINUX.a в libblas.a)
Тогда я могу скомпилировать файл C на Ubuntu, используя следующую команду:
gcc foo.c path/to/libblas.a
В моей ОС Mac OS X (EL Capitan) я могу скомпилировать BLAS (меняя LINUX в make.inc на DARWIN), но когда я пытаюсь скомпилировать код C с помощью вышеприведенной команды, я получаю такие ошибки, как показано ниже:
Undefined symbols for architecture x86_64:
"_ddot_", referenced from:
_main in foo-3a35db.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
(«ddot» часть отличается для различных функций)
возможности:
- Может быть, я не компиляции библиотеки правильно на макинтош и есть некоторые различия я не ав имеют
- Встроенная команда Ускорить рамках Mac OS X Мессинг с процессом компиляции
P.S. Ребята, я знаю, что BLAS/LAPACK уже встроен в среду Mac OS X Accelerate, и я могу легко скомпилировать ее с помощью команды gcc foo.c -lblas
или gcc foo.c -framework Accelerate
, но я хочу использовать скомпилированный .a из netlib. Я хочу знать, почему он работает правильно на ubuntu, но не Mac OS X?
P.S.2. Обратите внимание, что я могу скомпилировать исходный код без ошибок в Mac OS X. Я просто могу использовать его!
Пример кода: source
#include <stdio.h>
#include <stdlib.h>
double ddot_(const int *N, const double *a, const int *inca, const double *b, const int *incb);
int main(int argc, char **argv) {
double *a = (double *)malloc(3 * sizeof(double));
a[0] = 1.0;
a[1] = 2.0;
a[2] = 3.0;
// on the stack
double b[3] = {4.0, 5.0, 6.0};
int N = 3, one = 1; // one really doesn't look good in C
double dot_product = ddot_(&N, a, &one, b, &one);
printf(" The dot product is: %f \n", dot_product);
return 0;
}
(edit1) Раствор:
- открыт make.inc
- изменить линию
OPTS = -O3
кOPTS = -O3 -pipe -c
и сделать.
(edit2): лучшее решение: , так как я задал этот вопрос, я понял, что делаю все неправильно. Netlib BLAS на самом деле представляет собой набор fortran подпрограмм/подпрограмм/функций. и Makefile в исходном коде просто дает нам статическую библиотеку libblas.a, которая представляет собой коллекцию всех объектных файлов .o, скомпилированных с помощью gfortran. когда мы хотим скомпилировать код C, который хочет вызвать одну из этих подпрограмм, нам также нужно связать с библиотекой gfortran libgfortran. * поэтому, если у вас установлена gcc (brew install gcc). найдите libgfrotran * (sudo find/-name "libgfortrn.*"
), а затем свяжите свой gcc с этой папкой.чтобы сделать его легко я положил Makefile здесь:
all:
gcc -c foo.c
gcc -o bar.out foo.o -L path/to/libgfortran.*/ -lgfortran -L path/to/libblas.a -lblas
или в качестве альтернативы компиляции кода непосредственно gfortran:
all:
gcc -c foo.c
gfortran -o bar.out foo.o -L path/to/libblas.a -lblas
или просто компилировать с:
gcc foo.c bar.out -L path/to/libblas.a -lblas -L path/to/libgfortran.*/ -lgfortran
чудо как/почему первое решение действительно сработало и почему на ubuntu вам не нужно ссылаться на -lgfortran!
Думаю, мне удалось решить проблему, используя флаги, которые вы только что дали. Похоже, что добавив флаги '-pipe -c' в файл' make.inc', теперь библиотека BLAS скомпилирована правильно, и я могу использовать ее для компиляции другого C-кода. Я попробую еще раз. Я сообщу об этом здесь – Foad
Не беспокойтесь о '-pipe' (это означает: не создавайте временные файлы в'/tmp', а используйте каналы UNIX для связи между цепочкой инструментов компилятора и линкера). Флаг '-c 'просто означает _compile-only_ (не связывайтесь и не пытайтесь создать исполняемый двоичный файл). – Piotr
да на самом деле я был совершенно неправ. Я добавил дополнительные сведения к сообщению. не могли бы вы проверить его и сообщить, правильно ли это или нет? – Foad