Компиляция программы на C - PullRequest
1 голос
/ 11 июля 2011

Я пытаюсь скомпилировать этот код, но если я использую:

gcc prt.c portaudio.h -o prt

но я получаю эту ошибку:

main.c:47: undefined reference to `Pa_OpenDefaultStream'
main.c:62: undefined reference to `Pa_StartStream'
main.c:65: undefined reference to `Pa_Sleep'
main.c:66: undefined reference to `Pa_StopStream'
main.c:69: undefined reference to `Pa_CloseStream'
main.c:72: undefined reference to `Pa_Terminate'
main.c:78: undefined reference to `Pa_Terminate'

я не знаю почему, тогда я, хотя это может быть потому, что у меня нет правила (сделать файл) так что я сделал один:

main: main.o
    gcc main.o -o main

main.o: main.c portaudio.h
    gcc -c main.c

но когда я пытаюсь запустить его через cygwin: используйте "Make" я получаю это сообщение:

"make: *** No targets specified and no makefile found. Stop.

Я не понимаю проблемы, пожалуйста, помогите мне, что-то не так с моим make-файлом или что-то еще не так.

также это код: main.c

#include <stdio.h>
#include "portaudio.h"

#define SAMPLE_RATE (44100)


typedef struct
{
   float left_phase;
   float right_phase;
}
paTestData;

static int patestCallback( const void *inputBuffer, void *outputBuffer,
                       unsigned long framesPerBuffer,
                       const PaStreamCallbackTimeInfo* timeInfo,
                       PaStreamCallbackFlags statusFlags,
                       void *userData )
{
/* Cast data passed through stream to our structure. */
paTestData *data = (paTestData*)userData;
float *out = (float*)outputBuffer;
unsigned int i;
(void) inputBuffer; /* Prevent unused variable warning. */

for( i=0; i<framesPerBuffer; i++ )
{
    *out++ = data->left_phase;  /* left */
    *out++ = data->right_phase;  /* right */
    /* Generate simple sawtooth phaser that ranges between -1.0 and 1.0. */
    data->left_phase += 0.01f;
    /* When signal reaches top, drop back down. */
    if( data->left_phase >= 1.0f ) data->left_phase -= 2.0f;
    /* higher pitch so we can distinguish left and right. */
    data->right_phase += 0.03f;
    if( data->right_phase >= 1.0f ) data->right_phase -= 2.0f;
}
return 0;
}


static paTestData data;

int main (void) {
PaStream *stream;
PaError err;
err = Pa_OpenDefaultStream( &stream,
                            0,          /* no input channels */
                            2,          /* stereo output */
                            paFloat32,  /* 32 bit floating point output */
                            SAMPLE_RATE,
                            256,        /* frames per buffer, i.e. the number
                                               of sample frames that PortAudio will
                                               request from the callback. Many apps
                                               may want to use
                                               paFramesPerBufferUnspecified, which
                                               tells PortAudio to pick the best,
                                               possibly changing, buffer size.*/
                            patestCallback, /* this is your callback function */
                            &data ); /*This is a pointer that will be passed to
                                               your callback*/
                         err = Pa_StartStream( stream );
                         if( err != paNoError ) goto error;

                         Pa_Sleep(9*1000);
                        err = Pa_StopStream( stream );
                        if( err != paNoError ) goto error;

                        err = Pa_CloseStream( stream );
                        if( err != paNoError ) goto error;

                        err = Pa_Terminate( );
                        if( err != paNoError ) goto error;

                        printf("Test finished.\n");
                        return err;
                    error:
                        Pa_Terminate();

                        return err;




   }

и заголовочный файл portaudio.h: Portaudio.h если вы хотите более чистый вид main.c: main.c

Я не совсем уверен, почему приходят эти сообщения / ошибки / предупреждения, пожалуйста, помогите.

также это мой вид папки: enter image description here

Ответы [ 8 ]

2 голосов
/ 11 июля 2011

Вы, кажется, используете функции из библиотеки для средства 'Port Audio', но ваша строка ссылки не сообщает компилятору C, как найти эту библиотеку - поэтому функции отображаются как неопределенные ссылки.

Ваша строка ссылки должна выглядеть примерно так:

gcc -o main main.o -lpa

Это должно быть макросизировано, но суть верна.

Это предполагает, что библиотека находится в 'libpa.a' или около того.Если он находится в libportaudio.so, тогда используйте -lportaudio вместо -lpa.

Использование макросов в make-файле:

PROGRAM = main
SOURCE  = main.c
OBJECT  = $(SOURCE:.c=.o)
LIBDIR  = /cygdrive/c/installdir/portaudio/lib
LIBRARY = $(LIBDIR)/portaudio_x86.lib

$(PROGRAM): $(OBJECT)
    $(CC) $(CFLAGS) -o $@ $(OBJECT) $(LDFLAGS) $(LIBRARY)


main.o: main.c portaudio.h

Вам не нужна явная команда компиляциидля main.o;make должен быть в состоянии вывести это из своих внутренних правил.Обратите внимание, что символ перед $(CC) должен быть TAB , а не пробелами.

1 голос
/ 11 июля 2011

Вы, вероятно, не ссылаетесь на эти библиотеки. Библиотеки (.so или .a) просматривают документацию и видят, с какими библиотеками вам нужно связать вашу программу.

Другое дело, что когда вы запускаете "make -f Makefile "вам нужно иметь вкладку в вашем make-файле перед строками" gcc ... ", т.е. командными строками.

1 голос
/ 11 июля 2011

Похоже, вам нужно включить библиотеку (с опцией -l[library name]. Поиск команд компиляции portaudio показывает, что libportaudio.a включено в опции gcc.

1 голос
/ 11 июля 2011

Ваша первоначальная проблема («Неопределенная ссылка на ...») - это сообщение от компоновщика о том, что он не может найти определение упомянутых функций.Это означает, что вам нужно добавить аргумент компоновщика, говорящий о том, что вы хотите добавить библиотеку, предоставляющую эти функции (lib portaudio?) В вашу программу.Параметр командной строки GCC для этого: "-l"

1 голос
/ 11 июля 2011

У portaudio был .lib или что-то еще? Заголовочный файл содержит только названия функций, а не определения. Вам нужно будет связаться с библиотекой, чтобы получить функциональность для всех этих функций

1 голос
/ 11 июля 2011

Также может показаться, что вам нужна библиотека PortAudio для связи, иначе эти функции не будут определены.То есть, если они не определены в заголовке (я не использовал эту библиотеку раньше ...)

1 голос
/ 11 июля 2011

Команда make ищет только файл с именем makefile или Makefile, чтобы использовать make с другим именем makefile, вам нужно выполнить make -f otherfile target.

Переименовать файл Make файл Makefile, чтобы просмотреть его содержимое.Также убедитесь, что вы используете один символ табуляции (без пробелов) во всех командах под целью.Возможно, вы сделали это, но ваша вырезка и вставка содержимого в этом посте не дает нам знать, действительно ли это так.

0 голосов
/ 28 августа 2018

Мне также нужно добавить -lm, в противном случае выдает ошибку.
Итак gcc -o test test.c -lm -lportaudio

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...