Не в состоянии скомпилировать исходный код с JACK API

Для справки: я сейчас нахожусь на Manjaro (Arch Linux) и использую компилятор GNU g++. Я хочу создать программу для JACK (Jack Audio Connection Kit) и сейчас пытаюсь использовать их API, представленный здесь. Я установил Jack2, но также попробовал его с Jack2-dbus. Я нашел что-то в AUR под названием jackcpp, но это тоже не помогло.

Чтобы добраться до моей проблемы: я не могу скомпилировать их примеры клиентов, перечисленных, и, очевидно, я не могу построить свой собственный, используя этот API. Я подозреваю, что это сломано, но я не могу вообразить, что никто не сообщает об этом, поэтому я действительно не знаю, что делать сейчас.

В моем jacktest.cpp написано следующее:

#include <iostream>
#include "jack/control.h"

int main(){
    jackctl_server_t *server;
    jackctl_driver_t *driver;

    if (jackctl_server_start(server, driver)) {
        std::cout << "Started!";
        return 0;
    }else{
        std::cout <<"Failed!";
        return 1;
    };
}

на основе функции, задокументированной здесь. Попробуйте запустить сервер jack и вернуть bool, если операция прошла успешно или нет. Если я попытаюсь скомпилировать это (с помощью 'pkg-config', как я должен):

$ g++ -o jacktest `pkg-config --cflags --libs jack` jacktest.cpp

это бросает:

jacktest.cpp:8:44: error: too many arguments to function 'bool jackctl_server_start(jackctl_server_t*)'
     if (jackctl_server_start(server, driver))

Поэтому я проверил и, действительно, в моем /usr/include/jack/control.h он определяет jackctl_server_start только с одним аргументом. Я не знаю, устарела ли их документация или я пропустил файлы / имею неправильные... Тогда я попытался сделать это только с одним аргументом

...    
if (jackctl_server_start(server)) {
...

который затем бросает:

/usr/bin/ld: /tmp/ccxm3fWC.o: undefined reference to symbol '_ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4'
/usr/lib/libstdc++.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

Я попытался изменить аргументы:

$ g++ -o jacktest `pkg-config --cflags --libs jack` jacktest.cpp
$ g++ -o jacktest jacktest.cpp `pkg-config --cflags --libs jack`
$ g++ jacktest.cpp `pkg-config --cflags --libs jack` -o jacktest
$ g++  jacktest.cpp -o jacktest `pkg-config --cflags --libs jack`

который всегда выдает одну и ту же ошибку...

Теперь то, что заставляет меня думать, что что-то сломано: теперь еще один jacktest_2.cpp, включая jack.h и исключая control.h

#include <iostream>
#include "jack/jack.h"

int main(){
    jack_client_t *client;

    if (client = jack_client_new("test_client")) {
        std::cout << "Running!";
        return 0;
    }else{
        std::cout <<"Not Running!";
        return 1;
    };
}

который я МОГУ Скомпилировать:

$ g++ -o jacktest_2 jacktest_2.cpp `pkg-config --cflags --libs jack`

хотя это дает мне жалобы на то, что эта функция ограничена, программа тоже делает то, что должна! Так хоть что-то из этого работает?!

Также:

$ g++ -print-file-name=jack 
/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.1/../../../../lib/jack

это нормально? В usr/lib/gcc/x86_64-pc-linux-gnu/7.2.1 нет lib / jack

В заключение: мне действительно НУЖЕН control.h, я даже дошел до того, что изменил control.h и включил их часть "драйвера" из API-документов обратно в функцию, но это никуда меня не привело ни... (undefined ссылка...) Я чувствую, что мне не хватает чего-то очень простого, или что-то действительно сломано с этим API. Я был на этом почти неделю, и я просто не могу понять это.

1 ответ

Решение

Если кто-то наткнется на это и спросит, что случилось: я разместил это на форуме JackAudio здесь. Любой может прочитать его, если захочет, но я отмечу этот вопрос как ответивший сейчас, так как это действительно не проблема C++ или компиляции, а проблема Джека. Спасибо!

Другие вопросы по тегам