Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Undefined reference GCC


Автор: CoDecode 18.9.2008, 21:26
Я вообще любитель звук программировать, но весьма не опытный и только недавно совсем начал разбираться как с самим Линухом, так и с его "звуконисущими" возможностями. До этого небольшой опыт был в виндушке да и то - на Бейсике. 
Посмотрел по имеющейся литературе, пошатался по Инету - ничего путного не нашел, в по данному случаю. Недавно STK пробовал мучить - такая же проблема, сейчас пытался демку запустить от ALSA. Там короче подключается заголовок, в котором тоже подключаются уйма <*.h>. Ну я все вроди правильно сделал, а когда пришло время компилить *.o - файл - вывело кучу ошибок, мол undefined reference to...

Это *.cpp..
Код

 /*  *  This extra small demo sends a random samples to your speakers.
  */
 
 #include "asoundlib.h"
 static char *device = "default";                        /* playback device */
 
 snd_output_t *output = NULL;
 unsigned char buffer[16*1024];                          /* some random data */
 
 int main(void)
 {
         int err;
         unsigned int i;
         snd_pcm_t *handle;
        snd_pcm_sframes_t frames;
 
         for (i = 0; i < sizeof(buffer); i++)
                 buffer[i] = random() & 0xff;
 
         if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
               printf("Playback open error: %s\n", snd_strerror(err));
                exit(EXIT_FAILURE);
         }
         if ((err = snd_pcm_set_params(handle,
                                       SND_PCM_FORMAT_U8,
                                       SND_PCM_ACCESS_RW_INTERLEAVED,
                                       1,
                                       48000,
                                       1,
                                       500000)) < 0) {   /* 0.5sec */
                 printf("Playback open error: %s\n", snd_strerror(err));
                 exit(EXIT_FAILURE);
         }
 
         for (i = 0; i < 16; i++) {
                 frames = snd_pcm_writei(handle, buffer, sizeof(buffer));
                 if (frames < 0)
                         frames = snd_pcm_recover(handle, frames, 0);
                 if (frames < 0) {
                         printf("snd_pcm_writei failed: %s\n", snd_strerror(err));
                         break;
                 }
                 if (frames > 0 && frames < (long)sizeof(buffer))
                         printf("Short write (expected %li, wrote %li)\n", (long)sizeof(buffer), frames);
         }
 
         snd_pcm_close(handle);
         return 0;
 }



А это *.h(asoundlib.h), кинутый в туже директорию что и *.cpp...
Код

#ifndef __ASOUNDLIB_H
#define __ASOUNDLIB_H

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <assert.h>
#include <endian.h>
#include <sys/poll.h>
#include <errno.h>
#include <stdarg.h>

#include <alsa/asoundef.h>
#include <alsa/version.h>
#include <alsa/global.h>
#include <alsa/input.h>
#include <alsa/output.h>
#include <alsa/error.h>
#include <alsa/conf.h>
#include <alsa/pcm.h>
#include <alsa/rawmidi.h>
#include <alsa/timer.h>
#include <alsa/hwdep.h>
#include <alsa/control.h>
#include <alsa/mixer.h>
#include <alsa/seq_event.h>
#include <alsa/seq.h>
#include <alsa/seqmid.h>
#include <alsa/seq_midi_event.h>
#include <alsa/conv.h>
#include <alsa/instr.h>

#endif /* __ASOUNDLIB_H */



А это ашыпки...
Код

/tmp/ccd3oXOx.o: In function `main':
pcm_min.c:(.text+0x5f): undefined reference to `snd_pcm_open'
pcm_min.c:(.text+0x73): undefined reference to `snd_strerror'
pcm_min.c:(.text+0xca): undefined reference to `snd_pcm_set_params'
pcm_min.c:(.text+0xde): undefined reference to `snd_strerror'
pcm_min.c:(.text+0x121): undefined reference to `snd_pcm_writei'
pcm_min.c:(.text+0x144): undefined reference to `snd_pcm_recover'
pcm_min.c:(.text+0x158): undefined reference to `snd_strerror'
pcm_min.c:(.text+0x1ad): undefined reference to `snd_pcm_close'
collect2: выполнение ld завершилось с кодом возврата 1
Compilation failed.


Библиотека ALSA libasound2 естественно есть и прекрасно служит.. dev-файлы для ALSA, как видно тоже есть.. Компилил в Geany(IDE) командой gcc -c "%f"
Это наверно что-то компилятор непонимает, да? Ему нужно как-то по другому объяснить, что ли? Не судите строго - я начинающий. Просто какой бы код меня не выводил на работу со сторонними апи - постоянно эти undefined'ы, когда все вроди сделал правильно.
Скажите пожалуйста - в чем может быть дело? Может я совсем не шарю в gcc(а оно так и есть)?
ПАСИБА!!! smile 

Автор: Fin 18.9.2008, 21:37
Попробуй добавить при компиляции такой параметр компиляции -lasound2

Автор: CoDecode 18.9.2008, 21:48
Это при сборке

Код

gcc -c -lasound2 "pcm_min.c" (в папке: /media/F/ExAmPlEs&SoUrCeS/Si/ALSA)
gcc: -lasound2: входные файлы компоновки не использованы, поскольку компоновка не выполнялась


ну и аналогично если иправить "-lasound2" на "-libasound2"(вы, возможно описались) и при компиляции тоже что и раньше..

Автор: Fin 18.9.2008, 22:05
Когда подключается библиотека, lib убирается из названия.

Автор: CoDecode 18.9.2008, 22:14
Да? Простите, яж фонарь...
А за какую компоновку он говорит?

Автор: Fin 18.9.2008, 22:20
Вот строчка компиляции,
Код

 gcc main.c  -lasound -o main

 твой код у меня скомпилировался и запустился.

Есть динамическая библиотека libasound.so, у меня она находится в каталоге /usr/lib. В ней находится уже скомпилированный код. Когда ты подключаеш хедеры к программе, ты просто говориш компилятору, что такая функция сушествует. На стадии линковки программы, компилятор должен связать эти функции с реально сушествуюшими функциями. Для этого нужно подключать библиотеку, чтобы линковшик знал, где они физически находятся. Если в конце построения программы, выяснится, что что-то линковшик не смог связать, он и выдает сообшение undefined reference to 

Автор: CoDecode 18.9.2008, 23:29
Пасиба, дружищь!!! У меня тоже все ОКей! Только это.. А что означают эти параметры? Ну я имею в веду -o? По умолчанию IDE просила выполнить gcc -c "%f".. Не, это я потом так сделал, а сначала вообще было gcc -Wall -c "%f"(так, вроди).. Дело в том, что много кода выполнялось просто с помощью gcc -Wall -c "%f", но это тот код, который не работает с апи неродных библиотек. Тогда получается, что если хочешь по другому - нужно прописывать gcc name.c  -lname(libname) -o name, да?
Это первое звуковое приложение, которое я скомпилил на Линухе!!! Я за тя, Fin выпью, дружищь! smile 

Автор: nickless 21.9.2008, 20:27
Цитата(CoDecode @  18.9.2008,  22:29 Найти цитируемый пост)
А что означают эти параметры?

Они все описаны в документации (man gcc), например -o от слова output, -c - compile, -l - library...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)