【问题标题】:Compiling a C program编译一个 C 程序
【发布时间】:2011-07-11 15:39:22
【问题描述】:

我正在尝试编译此代码,但如果我确实使用:

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

我不太清楚为什么会出现这些消息/错误/警告,请帮忙。

这也是我的文件夹视图:

【问题讨论】:

  • 符号 Pa_* 在哪里定义?是否有您应该链接的库?
  • 是的,有一个名为 portaudio_x86.lib 的库,但我不知道如何在 make 文件中链接它或将它放在哪里。另外,如果你知道如何在 Visual C++ 2008 中做到这一点,那就太好了

标签: c compiler-construction


【解决方案1】:

您似乎正在为“端口音频”设施使用库中的函数,但您的链接行并没有告诉 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而不是空格。

【讨论】:

  • 它带有“portaudio_x86.lib”,所以我会添加:gcc -o main main.o -portaudio_x86 但是我应该在make文件中的哪里添加它?
  • @Rave:当名称不是libxyz.lib 的形式时,我不确定您是否可以在库中使用-lxyz 表示法。指定库的完整路径,如 makefile 示例所示,应该可以工作。
  • 嘿,我这样做了:pastebin.com/sCtC3WBm 但我仍然收到此错误:“make: *** No rule to make target 'main.c', required by 'main.o'. Stop. 停止。 "
【解决方案2】:

make 命令只查找名为 makefileMakefile 的文件,要使用 make 与不同名称的 makefile,您需要执行 make -f otherfile target

将您的文件Make 文件重命名为Makefile 以查看其内容。此外,请确认您在目标下的所有命令中都使用了一个制表符(无空格)。您可能已经这样做了,但是您在此帖子中的内容的剪切和粘贴并没有让我们知道它是否真的是这样。

【讨论】:

  • 嘿,我做到了,现在我收到另一个错误/警告。 make: *** 没有规则来制作目标 'main.c','main.o' 需要。停止。这没有意义。 (我确实有一个标签,用于目标)
  • 它不知道如何制作main.c,这通常意味着该目录中没有main.c。检查文件权限问题以及大小写是否存在差异。如果您看到main.c 并且无法弄清楚它可能是什么,那么您很可能在文件名中嵌入了一个特殊字符。如果是这样,将其复制到 main.c 即可。
  • 嘿,只是为了跟进(以防有人可能有同样的问题),我使用了 netbeans(或者你可以使用 Visual C++),我做了一个项目,添加了源文件和头文件。我忘记的一件事是链接它,所以转到项目属性->链接并在那里添加链接器文件。以防万一有人在谷歌上搜索遇到同样的问题
【解决方案3】:

您似乎还需要链接到 PortAudio 库,否则这些函数将不会被定义。也就是说,除非它们在标题中定义(我之前没有使用过那个库......)

【讨论】:

    【解决方案4】:

    portaudio 是否带有 .lib 或其他文件?头文件只包含函数的名称,不包含定义。您需要链接库以获取所有这些功能的功能

    【讨论】:

      【解决方案5】:

      您最初的问题(“未定义对...的引用”)是来自链接器 的消息,说它找不到所提及函数的定义。这意味着您需要添加一个链接器参数,说明您希望将提供这些功能的库(lib portaudio?)添加到您的程序中。 GCC 的命令行参数是“-l”

      【讨论】:

        【解决方案6】:

        您似乎需要包含该库(使用-l[library name] 选项。 搜索 portaudio 编译命令显示 gcc 选项中包含 libportaudio.a

        【讨论】:

          【解决方案7】:

          您可能没有链接到那些库库(.so 或 .a)查看文档并查看需要哪些库来链接您的程序。

          另一件事是,当您运行“make -f Makefile”时,您需要在“gcc...”行(即命令行)之前的 makefile 中有一个选项卡。

          【讨论】:

            【解决方案8】:

            我还需要加-lm,否则会报错。
            所以gcc -o test test.c -lm -lportaudio

            【讨论】:

              猜你喜欢
              • 2010-10-08
              • 2013-08-22
              • 2022-07-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-03
              • 2011-08-22
              相关资源
              最近更新 更多