Portaudio einbinden



  • Hallo,

    nach langer - seeeeehr langer - Zeit möchte ich mich mal wieder mit C++ beschäftigen und was soll ich sagen ... ich habe so ziemlich alles verlernt. Ich habe die Hoffnung, ihr könnt mir da wieder ein wenig helfen.

    Das Ziel: ich möchte gerne Portaudio einbinden und verwenden.

    Dazu habe ich als erstes mir Portaudio besorgt und erstellt.

    # sh .\configure --enable-cxx CXXFLAGS=-std=c++17
    # make
    # make install
    

    Von dem Ergebnis ziehe ich mir das "include" Verzeichnis in mein Projekt.

    include
    |- portaudiocpp/
    |- portaudio.h

    Meine CMakeLists.txt:

    cmake_minimum_required(VERSION 3.8)
    
    project(portaudio-test)
    
    set(CMAKE_CXX_STANDARD 17)
    set(SOURCE_FILES main.cpp)
    set(VENDOR ${CMAKE_BINARY_DIR}/../vendor)
    
    add_library(portaudio ${VENDOR}/include/portaudio)
    
    add_executable(portaudio-test ${SOURCE_FILES})
    
    set_target_properties(portaudio PROPERTIES LINKER_LANGUAGE CXX)
    
    target_link_libraries(portaudio-test portaudio)
    

    und meine main.cpp

    #include <iostream>
    #include "vendor/include/portaudio.h"
    
    int main()
    {
        std::cout << "Hello, World!" << Pa_GetVersion() << "*" << std::endl;
        return 0;
    }
    

    ich bekomme damit den geliebten Fehler:

    undefined reference to `Pa_GetVersion'
    

    Kann mir jemand sagen wo der Fehler liegt?

    PS: Betriebssystem: Win10
    PPS: falls es wichtig sein sollte: als IDE verwende ich CLion

    Beste Grüße
    moepmoep



  • moepmoep schrieb:

    add_library(portaudio ${VENDOR}/include/portaudio)
    

    Hier fehlen definitiv Informationen, ohne die CMake die Bibliothek nicht korrekt linken kann. Vor allem wo sich die Bibliotheks-Dateien selbst befinden.

    Ich würde das mal so versuchen:

    # Portaudio ist eine "importierte", extern gebaute Bibliothek.
    # Hier müssen keine Quellcode-Dateien oder Pfade angegeben werden.
    add_library(portaudio IMPORTED)
    
    # Hier werden die notwendigen Dateisystem-Pfade für die Bibliothek gesetzt.
    # Hinweis: IMPORTED_IMPLIB kann bei statischen Bibliotheken oder unter Linux weggelassen werden.
    # Nur für Windows-DLLs gibt es das Konzept der "Importbibliotheken" (mit diesen wird dann gelinkt
    # anstatt wie unter Linux direkt mit der DLL, bzw. .so-Datei).
    set_target_properties(
        portaudio
        IMPORTED_LOCATION "<Pfad zur .so, DLL, oder zur statischen .a oder .lib-Datei>"
        IMPORTED_IMPLIB "<Pfad zur .lib oder .a-Importbibkiothek, nur für Windows-DLLs>"
        INTERFACE_INCLUDE_DIRECTORIES "${VENDOR}/include"
    )
    

    INTERFACE_INCLUDE_DIRECTORIES bedeutet hier, dass dieses Include-Verzeichnis implizit zu allen Targets hinzugefügt werden soll, welche gegen portaudio linken.
    Ich habe dieses Include-Verzeichnis in meinem Beispiel mit ${VENDOR}/include so gewählt, dass man die portaudio.h so einbindet:

    #include <portaudio.h>
    

    Also bitte ggfs. anpassen.

    Gruss,
    Finnegan


Log in to reply