Raspberry Pi Zero OS에서 ALSA 프로젝트의 pcm.c 예제 컴파일 문제

Raspberry Pi Zero OS에서 ALSA 프로젝트의 pcm.c 예제 컴파일 문제

저는 Raspberry Pi 0W와 최신 Raspberry Pi OS를 사용하고 있습니다.

나는 libasound2와 libasound2-dev를 설치했고,라즈베리 파이 포럼alsa 라이브러리가 올바르게 컴파일되고 실행되는지 테스트하는 데 사용됩니다.

#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>
#include <alsa/pcm.h>

int main() {
  int val;

  printf("ALSA library version: %s\n", SND_LIB_VERSION_STR);

  printf("\nPCM stream types:\n");
  for (val = 0; val <= SND_PCM_STREAM_LAST; val++)
    printf("  %s\n",
      snd_pcm_stream_name((snd_pcm_stream_t)val));

  return 0;
}  

ALSA 프로젝트 웹사이트에 제공된 사인파 생성 예제 코드를 컴파일하려고 합니다.https://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html

이는 예제 페이지에 pcm.c로 나열되어 있습니다.

이 코드를 main.cpp에 저장하고 다음으로 변경했습니다 #include "../include/asoundlib.h"(이로 인해 컴파일할 때 파일을 찾을 수 없음 오류가 발생함).#include <alsa/asoundlib.h>

나는 이것을 사용하여 이것을 컴파일합니다 gcc main.cpp -o main -lasound -fpermissive. 일련의 경고가 표시되지만 결국 디스플레이 for (format = 0; format < SND_PCM_FORMAT_LAST; format++) {에는 no match for operator++and 로 선언 되었습니다 operand type is 'snd_pcm_format_t' {aka '_snd_pcm_format'}).formatstatic snd_pcm_format_t format = SND_PCM_FORMAT_S16;snd_pcm_format_t그들의 문서에 따르면.

이 기본 예제를 컴파일하려면 어떻게 해야 합니까? 아니면 C++를 사용하여 ALSA에서 사인 톤을 생성하는 방법을 보여주는 간단한 예나 ALSA의 샘플 코드 작동 방식을 설명하는 블로그 또는 튜토리얼이 있습니까?

편집: 빌드 중에 표시되는 메시지는 다음과 같습니다. [오류는 다음과 같습니다.main.cpp:842:66: 오류: 'operator++'와 일치하지 않습니다.]

$ gcc main.cpp -o Main -lasound -fpermissive
main.cpp:19:23: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
 static char *device = "plughw:0,0";         /* playback device */
                       ^~~~~~~~~~~~
main.cpp: In function ‘int write_and_poll_loop(snd_pcm_t*, short int*, snd_pcm_channel_area_t*)’:
main.cpp:314:18: warning: invalid conversion from ‘void*’ to ‘pollfd*’ [-fpermissive]
     ufds = malloc(sizeof(struct pollfd) * count);
            ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp: In function ‘void async_callback(snd_async_handler_t*)’:
main.cpp:397:77: warning: invalid conversion from ‘void*’ to ‘async_private_data*’ [-fpermissive]
 ct async_private_data *data = snd_async_handler_get_callback_private(ahandler);
                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~

main.cpp: In function ‘void async_direct_callback(snd_async_handler_t*)’:
main.cpp:469:77: warning: invalid conversion from ‘void*’ to ‘async_private_data*’ [-fpermissive]
 ct async_private_data *data = snd_async_handler_get_callback_private(ahandler);
                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~

main.cpp: In function ‘void help()’:
main.cpp:756:53: warning: invalid conversion from ‘int’ to ‘snd_pcm_format_t’ {aka ‘_snd_pcm_format’} [-fpermissive]
                 const char *s = snd_pcm_format_name(k);
                                                     ^
In file included from /usr/include/alsa/asoundlib.h:54,
                 from main.cpp:14:
/usr/include/alsa/pcm.h:1065:56: note:   initializing argument 1 of ‘const char* snd_pcm_format_name(snd_pcm_format_t)’
 const char *snd_pcm_format_name(const snd_pcm_format_t format);
                                 ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
main.cpp: In function ‘int main(int, char**)’:
main.cpp:842:27: warning: invalid conversion from ‘int’ to ‘snd_pcm_format_t’ {aka ‘_snd_pcm_format’} [-fpermissive]
             for (format = 0; format < SND_PCM_FORMAT_LAST; format++) {
                           ^
main.cpp:842:66: warning: no ‘operator++(int)’ declared for postfix ‘++’, trying prefix operator instead [-fpermissive]
             for (format = 0; format < SND_PCM_FORMAT_LAST; format++) {
                                                            ~~~~~~^~
main.cpp:842:66: error: no match for ‘operator++’ (operand type is ‘snd_pcm_format_t’ {aka ‘_snd_pcm_format’})
main.cpp:903:21: warning: invalid conversion from ‘void*’ to ‘short int*’ [-fpermissive]
     samples = malloc((period_size * channels * snd_pcm_format_physical_width(format)) / 8);
               ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:909:19: warning: invalid conversion from ‘void*’ to ‘snd_pcm_channel_area_t*’ {aka ‘_snd_pcm_channel_area*’} [-fpermissive]
     areas = calloc(channels, sizeof(snd_pcm_channel_area_t));
             ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$  

gcc 대신 g++를 사용하면 동일한 오류가 발생합니다.

답변1

C++ 프로그램으로 컴파일하려고 합니다("ISO C++ 금지됨..."). 따라서 포함된 헤더가 C++가 아닌 C이기 때문에 다양한 경고가 발생합니다.

main.cppC 프로그램으로 컴파일 되도록 이름을 바꾸 거나 사용할 main.cC 헤더를 포함하는 올바른 C++ 방식을 사용 하고 자신의 코드가 C++ 표준을 따르는지 확인하십시오.extern "C"g++

관련 정보