2016-07-14 2 views
2

В проекте проекта, над которым я работаю, мне нужно иметь возможность открывать и читать содержимое из аудиофайлов (по крайней мере, WAV-файлов). Я установил libsndfile с помощью установщика Win64 с mega-nerd.com и создал простую программу на C, которая открывает и закрывает аудиофайл для тестирования библиотеки.Неопределенный справочный и плохой адрес репозиции при связывании с libsndfile

#include <stdio.h> 
#include <sndfile.h> 

int main() 
{ 
    SNDFILE *sndfPtr; 
    SF_INFO soundfileInfo; 
    char path[] = "C:\\Users\\jayb\\Documents\\MusicClips\\violin.wav"; 

    printf("Path: %s\n", path); 

    /* Open soundfile for reading */ 
    soundfileInfo.format = 0; /* Must be set to zero before opening */ 
    sndfPtr = sf_open(path, SFM_READ, &soundfileInfo); 
    if(sndfPtr == NULL) 
    { 
     fprintf(stderr, "Error: %s\n", sf_strerror(NULL)); 
     return -1; 
    } 

    /* Close soundfile and check for error */ 
    if(sf_close(sndfPtr)) 
    { 
     fprintf(stderr, "There was an error closing the soundfile\n"); 
     return -1; 
    } 

    return 0; 
} 

Однако я получаю неопределенные эталонные ошибки к функциям libsndfile, плюс плохая ошибка RELOC адрес, когда я пытаюсь компиляции/ссылки:

C:\Users\jbiernat\AppData\Local\Temp\ccSmO0dw.o:sndfile_test.c:(.text+0xbb): undefined reference to `sf_open' 
C:\Users\jbiernat\AppData\Local\Temp\ccSmO0dw.o:sndfile_test.c:(.text+0xd8): undefined reference to `sf_strerror' 
C:\Users\jbiernat\AppData\Local\Temp\ccSmO0dw.o:sndfile_test.c:(.text+0x10a): undefined reference to `sf_close' 
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\jbiernat\AppData\Local\Temp\ccSmO0dw.o: bad reloc address 0x20 in section `.eh_frame' 
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation 
collect2.exe: error: ld returned 1 exit status 

Я компиляции с помощью этой команды:

gcc -Wall -o sndfile_test.exe sndfile_test.c -llibsndfile-1 

Установочный из libsndfile поставляется с файлами заголовков sndfile.h и sndfile.hh и .lib, .def и .dll файлов: libsndfile-1.lib libsndfile-1.def libsndfile-1.dll

Каталоги заголовков и библиотек включены в путь поиска компилятора, и, похоже, проблема не связана с поиском библиотеки? Я связывающая файл .lib с -llibsndfile-1 согласно instructions on the minGW wiki

Я также скопировал и переименован в .lib файл с расширением .a и попытался связывания с -lsndfile-1 (это работает для кого-то другого, имеющего подобную проблему), но я когда я это делаю, получаю то же самое.

Любая помощь будет оценена! Если я не могу успешно подключиться к libsndfile, есть ли другие простые библиотеки, которые я мог бы использовать для чтения из аудиофайлов?


Edit: Конечно я провожу два дня, пытаясь найти решение, наконец, опубликовать в StackOverflow, а затем решить эту проблему через два часа. Я отправлю свое решение в качестве ответа на вопрос.

+2

Из голубой: Вы уверены, что разрядность для установки MinGW и библиотеки в линии, то есть оба либо 32 или 64 бит? – alk

+0

Попробуйте с помощью этой команды: 'gcc -Wall -o sndfile_test.exe sndfile_test.c -lsndfile' – user3078414

+0

@alk - Моя установка MinGW определенно 64-битная, а библиотека была установлена ​​с использованием загруженного 64-битного установщика, поэтому я могу только предположить, что библиотеки, построенные им, также являются 64-битными ... @ user3078414 - ссылка на -lsndfile возвращает ошибку 'can not find -sndfile', но спасибо за предложение –

ответ

1

Следуя информации о this page of the MinGW wiki, используйте файл dlltool MinGW с файлом libsndfile-1.def, чтобы воссоздать библиотеку импорта dll.

Используйте эту команду, чтобы сделать это:

dlltool -d libsndfile-1.def -l libsndfile-1.dll.a 

Это создаст файл .dll.a, который можно использовать вместо файла .lib. Обратите внимание, что когда я это сделал, файл .dll.a не отображался в каталоге, в котором я находился, когда я выполнил приведенную выше команду. Он оказался скрытым в моем каталоге \ AppData, поэтому вам, возможно, придется искать в нем свою ОС.

Заменить libsndfile-1.lib в вашем Lib каталога с libsndfile-1.dll.a и затем скомпилировать с помощью:

gcc -Wall -o sndfile_test.exe sndfile_test.c -lsndfile-1 
+0

Вы также можете принять свой выигранный ответ. – alk

Смежные вопросы