Hi,
I'm familiar with c++ but I don't know how to configure a project because I just worked on projects that have already been configured or used tools doing the job for me.
I would like to do this step by mylself.
And of course I'm facing some problems ! I'm stuck in the mud for several days !
I want to make an app using Juce (and after Qt).
I tyied IntroJuicer. Worked fine. It made me a beatiful Xcode Project I can start with.
But as I said, I want to understand how to configure a project by myself !
So I would like to use CMake to build my application.
I've found two tutorials:
- https://github.com/nclack/cmake-juce (for osx)
- http://www.juce.com/forum/topic/how-i-use-cmake-juce (for linux)
And in the two cases I always get that error:
Linking CXX executable main Undefined symbols for architecture x86_64: "_AudioHardwareServiceGetPropertyData", referenced from: juce::SystemVol::getGain() in libjuce.a(juce_audio_devices.cpp.o) juce::SystemVol::isMuted() in libjuce.a(juce_audio_devices.cpp.o) juce::SystemVol::SystemVol(unsigned int) in libjuce.a(juce_audio_devices.cpp.o) "_AudioHardwareServiceHasProperty", referenced from: juce::SystemVol::SystemVol(unsigned int) in libjuce.a(juce_audio_devices.cpp.o) "_AudioHardwareServiceIsPropertySettable", referenced from: juce::SystemVol::canSetVolume() in libjuce.a(juce_audio_devices.cpp.o) "_AudioHardwareServiceSetPropertyData", referenced from: juce::SystemVol::setGain(float) in libjuce.a(juce_audio_devices.cpp.o) juce::SystemVol::setMuted(bool) in libjuce.a(juce_audio_devices.cpp.o) "_vDSP_vadd", referenced from: juce::FloatVectorOperations::add(float*, float const*, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vaddD", referenced from: juce::FloatVectorOperations::add(double*, double const*, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vclr", referenced from: juce::FloatVectorOperations::clear(float*, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vclrD", referenced from: juce::FloatVectorOperations::clear(double*, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vfill", referenced from: juce::FloatVectorOperations::fill(float*, float, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vfillD", referenced from: juce::FloatVectorOperations::fill(double*, double, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vmul", referenced from: juce::FloatVectorOperations::multiply(float*, float const*, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vmulD", referenced from: juce::FloatVectorOperations::multiply(double*, double const*, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vneg", referenced from: juce::FloatVectorOperations::negate(float*, float const*, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vnegD", referenced from: juce::FloatVectorOperations::negate(double*, double const*, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vsmul", referenced from: juce::FloatVectorOperations::multiply(float*, float, int) in libjuce.a(juce_audio_basics.cpp.o) juce::FloatVectorOperations::copyWithMultiply(float*, float const*, float, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vsmulD", referenced from: juce::FloatVectorOperations::copyWithMultiply(double*, double const*, double, int) in libjuce.a(juce_audio_basics.cpp.o) juce::FloatVectorOperations::multiply(double*, double, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vsub", referenced from: juce::FloatVectorOperations::subtract(float*, float const*, int) in libjuce.a(juce_audio_basics.cpp.o) "_vDSP_vsubD", referenced from: juce::FloatVectorOperations::subtract(double*, double const*, int) in libjuce.a(juce_audio_basics.cpp.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[2]: *** [src-main/main] Error 1 make[1]: *** [src-main/CMakeFiles/main.dir/all] Error 2 make: *** [all] Error 2
Ater reading dozen of threads on various forums, I finally mixed and adapted the two tutorials together... Of course, I get the same error...
Here is my project:
/CMakeLists.txt
/lib/
-----/juce/
----------Appconfig.h
----------JuceHeader.h
----------modules/
---------------juce_audio_basics/
--------------------modules files...
---------------juce_audio_devices/
--------------------modules files...
---------------juce_audio_formats/
--------------------modules files...
---------------juce_core/
--------------------modules files...
---------------juce_data_structures/
--------------------modules files...
---------------juce_events/
--------------------modules files...
/src-juce/
-----CMakeLists.txt
/src-main/
-----CMakeLists.txt
-----Main.cpp
/CMakeLists.txt:
cmake_minimum_required(VERSION 2.8) INCLUDE_DIRECTORIES ( BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/lib/juce ) ADD_SUBDIRECTORY ( src-juce ) ADD_SUBDIRECTORY ( src-main )
/src-juce/CMakeLists.txt:
SET( CMAKE_CXX_FLAGS "-std=c++0x")
set_directory_properties(PROPERTIES
COMPILE_DEFINITIONS NDEBUG
COMPILE_DEFINITIONS_DEBUG DEBUG
COMPILE_DEFINITIONS_RELEASE NDEBUG
)
SET(JUCE_LIBRARIES
"-framework Carbon"
"-framework Cocoa"
"-framework CoreFoundation"
"-framework CoreAudio"
"-framework CoreMidi"
"-framework QuartzCore"
"-framework IOKit"
"-framework AGL"
"-lobjc")
SET(EXTRA_FLAGS "-x objective-c++")
SET ( JUCE_SOURCE
${CMAKE_HOME_DIRECTORY}/lib/juce/modules/juce_core/juce_core.cpp
${CMAKE_HOME_DIRECTORY}/lib/juce/modules/juce_data_structures/juce_data_structures.cpp
${CMAKE_HOME_DIRECTORY}/lib/juce/modules/juce_events/juce_events.cpp
${CMAKE_HOME_DIRECTORY}/lib/juce/modules/juce_audio_basics/juce_audio_basics.cpp
${CMAKE_HOME_DIRECTORY}/lib/juce/modules/juce_audio_devices/juce_audio_devices.cpp
${CMAKE_HOME_DIRECTORY}/lib/juce/modules/juce_audio_formats/juce_audio_formats.cpp
)
ADD_LIBRARY ( juce STATIC ${JUCE_SOURCE} )
TARGET_LINK_LIBRARIES ( juce ${CMAKE_THREAD_LIBS_INIT} ${JUCE_LIBRARIES} )
set_target_properties(juce PROPERTIES COMPILE_FLAGS ${EXTRA_FLAGS})
/src-main/CMakeLists.txt:
SET( CMAKE_CXX_FLAGS "-std=c++0x") FILE ( GLOB_RECURSE MAIN_SOURCE *.cpp ) LIST ( SORT MAIN_SOURCE ) ADD_EXECUTABLE ( main ${MAIN_SOURCE} ) TARGET_LINK_LIBRARIES ( main juce )
/src-main/Main.cpp:
#include <iostream> #include "../lib/juce/JuceHeader.h" int main(int argc, char *argv[]) { std::cout << "Bonjour" << std::endl; File audioFile("/path/to/myfile.wav"); WavAudioFormat format; FileInputStream *fileInputStream = new FileInputStream(audioFile);; ScopedPointer<juce::AudioFormatReader> reader(format.createReaderFor(fileInputStream,false)); AudioFormatReaderSource readerSource(reader, false); AudioTransportSource transportSource; transportSource.setSource(&readerSource); std::cout << transportSource.getLengthInSeconds() << std::endl; AudioSourcePlayer sourcePlayer; sourcePlayer.setSource(&transportSource); AudioDeviceManager deviceManager; deviceManager.initialiseWithDefaultDevices(0, 2); deviceManager.addAudioCallback(&sourcePlayer); transportSource.start(); while (! transportSource.hasStreamFinished()) { } std::cout << transportSource.isPlaying() << std::endl; return 0; }
I can't figure out what's wrong !
Any idea ?
Many thanks !!!
---FatMaxX
PS : please pardon my lack of knowledge and my english.