неопределенная ссылка на cblas_ddot при использовании библиотеки cblas

Я тестировал cblas ddot и использовал код из ссылки. и я исправил это как

#include <stdio.h>
#include <stdlib.h>
#include <cblas.h>

int main()
{
    double  m[10],n[10];
    int i;
    int result;

    printf("Enter the elements into first vector.\n");
    for(i=0;i<10;i++)
        scanf("%lf",&m[i]);

    printf("Enter the elements into second vector.\n");
    for(i=0;i<10;i++)
        scanf("%lf",&n[i]);

    result = cblas_ddot(10, m, 1, n, 1);
    printf("The result is %d\n",result);

    return 0;
}

Затем, когда я его скомпилировал, оказалось, что:

/tmp/ccJIpqKH.o: In function `main':
test.c:(.text+0xbc): undefined reference to `cblas_ddot'
collect2: ld returned 1 exit status

Я проверил файл cblas в /usr/include/cblas.h и заметил, что

double cblas_ddot(const int N, const double *X, const int incX,
              const double *Y, const int incY);

Я не знаю, где это идет не так. Почему компилятор сказал, что «cblas_ddot» — неопределенная ссылка?


person Old Panda    schedule 22.10.2013    source источник
comment
Как выглядит ваша командная строка GCC или Makefile?   -  person Jonathon Reinhart    schedule 22.10.2013


Ответы (2)


Вы не можете просто включить заголовок — это только сообщает компилятору, что функции существуют где-то. Вам нужно сообщить линкеру, что нужно скомпоновать библиотеку cblas.

Предполагая, что у вас есть файл libcblas.a, вы можете сообщить об этом GCC с помощью -lcblas.

Веб-сайт научной библиотеки GNU расскажет вам, как это сделать:

person Jonathon Reinhart    schedule 22.10.2013
comment
Я попробовал gcc -Wall -I/usr/include -c test.c, и это работает. Но потом я выполнил gcc test.o -o test, все равно было undefined reference to 'cblas_ddot'. - person Old Panda; 22.10.2013
comment
Первый вызов gcc просто компилирует test.c в test.o. Библиотека пока не используется. Если вы запустите readelf -s test.o, вы увидите неразрешенный символ cblas_ddot . Ваш второй вызов gcc просто связывает test.o с libc и создает окончательный исполняемый файл вывода. Именно здесь вам нужно указать привязку к библиотеке cblas. - person Jonathon Reinhart; 22.10.2013
comment
Я понял. Затем я попробовал метод здесь по-прежнему возникает ошибка /usr/bin/ld: cannot find -lcblas. - person Old Panda; 22.10.2013
comment
Вы установили библиотеку? -l будет искать в стандартных каталогах, которые не включают текущий каталог. - person Jonathon Reinhart; 22.10.2013
comment
Большое спасибо! Кажется, здесь нет lcblas или чего-то подобного. Возможно, библиотека не установлена. Спасибо еще раз. - person Old Panda; 22.10.2013

Моя проблема была только что решена. Причина в том, что я сделал ошибку при вводе пути ссылки. Спасибо за ответы Jonathon Reinhart, они очень полезны при обучении программированию в Linux.

Команды компиляции:

gcc -c test.c
gcc -L/usr/lib64 test.o -lgsl -lgslcblas -lm

Где «/usr/lib64» — правильный путь ссылки.

person Old Panda    schedule 23.10.2013