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.hMeine 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 CLionBeste 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 gegenportaudio
linken.
Ich habe dieses Include-Verzeichnis in meinem Beispiel mit${VENDOR}/include
so gewählt, dass man dieportaudio.h
so einbindet:#include <portaudio.h>
Also bitte ggfs. anpassen.
Gruss,
Finnegan