我正在尝试编译此代码,但如果我使用:
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.
我不明白这个问题,请帮我解决我的makefile有什么问题,或者还有别的错误。
这也是代码: 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
我不太清楚为什么会出现这些消息/错误/警告,请帮忙。
这也是我的文件夹视图:
答案 0 :(得分:2)
您似乎正在使用库中的函数来处理“Port Audio”工具,但您的链接行并没有告诉C编译器如何找到该库 - 因此这些函数显示为未定义的引用。
您的链接行应如下所示:
gcc -o main main.o -lpa
那应该是宏观的,但要点是正确的。
这假定库位于“libpa.a”或其附近。如果它位于'libportaudio.so',则使用-lportaudio
代替-lpa
。
在makefile中使用宏:
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 :(得分:1)
make
命令仅查找名为makefile
或Makefile
的文件,要使用带有不同名称的makefile的make,您需要执行make -f otherfile target
。
将文件Make
重命名为Makefile
以查看其内容。此外,验证在目标下的所有命令中使用一个制表符(无空格)。您可能已经这样做了,但是您对此帖子中内容的剪切和粘贴并不会让我们知道它是否真的如此。
答案 2 :(得分:1)
您似乎还需要PortAudio库链接到或者不会定义那些函数。也就是说,除非它们在标题中定义(我之前没有使用过该库...)
答案 3 :(得分:1)
portaudio是否带有.lib或其他东西?头文件仅包含函数的名称,而不是定义。您需要链接到库以获取所有这些功能的功能
答案 4 :(得分:1)
您的初始问题(“未定义的引用...”)是来自链接器的消息,说它无法找到所提及函数的定义。这意味着您需要添加一个链接器参数,表示您要将提供这些函数的库(lib portaudio?)添加到您的程序中。 GCC的命令行参数是“-l”
答案 5 :(得分:1)
您似乎需要包含库(使用-l[library name]
选项。
搜索portaudio编译命令会显示gcc选项中包含的libportaudio.a
。
答案 6 :(得分:1)
您可能没有链接到这些库libs(.so或.a)查看文档并查看链接程序所需的库。
另一件事是,当你运行“make -f Makefile”时,你需要在“gcc ...”行之前的makefile中有一个制表符,即命令行。
答案 7 :(得分:0)
我还需要添加-lm
,否则会引发错误。
所以gcc -o test test.c -lm -lportaudio