Search code examples
c++eclipseosc

OSCPack external library test case in Eclipse project


Can someone explain to me how to use the oscpack library in an Eclipse workspace based project? I have created the object files with make, added the ip and osc directories to my project tree, and added these directories to the include path list in Project settings>C/C++ Build>Settings>GCC C++ Compiler>Includes.

I haven't been able to get it working in Eclipse or the g++ commandline compiler. I am running out of ideas.

The code is the SimpleReceive.cpp from the oscpack site btw.

/* 
    Example of two different ways to process received OSC messages using oscpack.
    Receives the messages from the SimpleSend.cpp example.
*/

#include <iostream>

#include "osc/OscReceivedElements.h"
#include "osc/OscPacketListener.h"
#include "ip/UdpSocket.h"


#define PORT 7000

class ExamplePacketListener : public osc::OscPacketListener {
protected:

    virtual void ProcessMessage( const osc::ReceivedMessage& m, 
                const IpEndpointName& remoteEndpoint )
    {
        try{
            // example of parsing single messages. osc::OsckPacketListener
            // handles the bundle traversal.

            if( strcmp( m.AddressPattern(), "/test1" ) == 0 ){
                // example #1 -- argument stream interface
                osc::ReceivedMessageArgumentStream args = m.ArgumentStream();
                bool a1;
                osc::int32 a2;
                float a3;
                const char *a4;
                args >> a1 >> a2 >> a3 >> a4 >> osc::EndMessage;

                std::cout << "received '/test1' message with arguments: "
                    << a1 << " " << a2 << " " << a3 << " " << a4 << "\n";

            }else if( strcmp( m.AddressPattern(), "/test2" ) == 0 ){
                // example #2 -- argument iterator interface, supports
                // reflection for overloaded messages (eg you can call 
                // (*arg)->IsBool() to check if a bool was passed etc).
                osc::ReceivedMessage::const_iterator arg = m.ArgumentsBegin();
                bool a1 = (arg++)->AsBool();
                int a2 = (arg++)->AsInt32();
                float a3 = (arg++)->AsFloat();
                const char *a4 = (arg++)->AsString();
                if( arg != m.ArgumentsEnd() )
                    throw osc::ExcessArgumentException();

                std::cout << "received '/test2' message with arguments: "
                    << a1 << " " << a2 << " " << a3 << " " << a4 << "\n";
            }
        }catch( osc::Exception& e ){
            // any parsing errors such as unexpected argument types, or 
            // missing arguments get thrown as exceptions.
            std::cout << "error while parsing message: "
                << m.AddressPattern() << ": " << e.what() << "\n";
        }
    }
};

int main(int argc, char* argv[])
{
    ExamplePacketListener listener;
    UdpListeningReceiveSocket s(
            IpEndpointName( IpEndpointName::ANY_ADDRESS, PORT ),
            &listener );

    std::cout << "press ctrl-c to end\n";

    s.RunUntilSigInt();

    return 0;
}

Console output:

15:38:50 **** Incremental Build of configuration Debug for project NoteMaker_v2 ****
make all 
Building target: NoteMaker_v2
Invoking: MacOS X C++ Linker
g++  -o "NoteMaker_v2"  ./src/CommonFunctions.o ./src/DummyGen.o ./src/FileInterpreter.o ./src/GenAdmin.o ./src/Generator.o ./src/MusicalFunctions.o ./src/NoteBlock.o ./src/NoteMaker_v2.o ./src/NoteStack.o ./src/Serialism.o   
Undefined symbols for architecture x86_64:
  "osc::EndMessage", referenced from:
      ExamplePacketListener::ProcessMessage(osc::ReceivedMessage const&, IpEndpointName const&) in NoteMaker_v2.o
  "osc::ReceivedBundle::ReceivedBundle(osc::ReceivedPacket const&)", referenced from:
      osc::OscPacketListener::ProcessPacket(char const*, int, IpEndpointName const&) in NoteMaker_v2.o
  "osc::ReceivedBundle::ReceivedBundle(osc::ReceivedBundleElement const&)", referenced from:
      osc::OscPacketListener::ProcessBundle(osc::ReceivedBundle const&, IpEndpointName const&) in NoteMaker_v2.o
  "osc::ReceivedMessage::ReceivedMessage(osc::ReceivedPacket const&)", referenced from:
      osc::OscPacketListener::ProcessPacket(char const*, int, IpEndpointName const&) in NoteMaker_v2.o
  "osc::ReceivedMessage::ReceivedMessage(osc::ReceivedBundleElement const&)", referenced from:
      osc::OscPacketListener::ProcessBundle(osc::ReceivedBundle const&, IpEndpointName const&) in NoteMaker_v2.o
  "osc::ReceivedMessageArgumentIterator::Advance()", referenced from:
      osc::ReceivedMessageArgumentIterator::operator++(int) in NoteMaker_v2.o
  "osc::ReceivedPacket::IsBundle() const", referenced from:
      osc::OscPacketListener::ProcessPacket(char const*, int, IpEndpointName const&) in NoteMaker_v2.o
  "osc::ReceivedBundleElement::Size() const", referenced from:
      osc::ReceivedBundleElementIterator::Advance() in NoteMaker_v2.o
  "osc::ReceivedBundleElement::IsBundle() const", referenced from:
      osc::OscPacketListener::ProcessBundle(osc::ReceivedBundle const&, IpEndpointName const&) in NoteMaker_v2.o
  "osc::ReceivedMessageArgument::AsBool() const", referenced from:
      ExamplePacketListener::ProcessMessage(osc::ReceivedMessage const&, IpEndpointName const&) in NoteMaker_v2.o
      osc::ReceivedMessageArgumentStream::operator>>(bool&) in NoteMaker_v2.o
  "osc::ReceivedMessageArgument::AsFloat() const", referenced from:
      ExamplePacketListener::ProcessMessage(osc::ReceivedMessage const&, IpEndpointName const&) in NoteMaker_v2.o
      osc::ReceivedMessageArgumentStream::operator>>(float&) in NoteMaker_v2.o
  "osc::ReceivedMessageArgument::AsInt32() const", referenced from:
      ExamplePacketListener::ProcessMessage(osc::ReceivedMessage const&, IpEndpointName const&) in NoteMaker_v2.o
      osc::ReceivedMessageArgumentStream::operator>>(int&) in NoteMaker_v2.o
  "osc::ReceivedMessageArgument::AsString() const", referenced from:
      ExamplePacketListener::ProcessMessage(osc::ReceivedMessage const&, IpEndpointName const&) in NoteMaker_v2.o
      osc::ReceivedMessageArgumentStream::operator>>(char const*&) in NoteMaker_v2.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: *** [NoteMaker_v2] Error 1

15:38:50 Build Finished (took 279ms)

Solution

  • So you needed to configure the paths and compiler/linker options.

    On my ubuntu box, after apt-get install liboscpack-dev it compiled fine using the following options:

    g++ -Wall -pedantic -g -O0 -I /usr/include/oscpack test.cpp -o test -loscpack
    

    On your box you might need to add the path to the library too, e.g.

    -L /usr/local/lib/oscpack
    

    (I did add #include <cstring> that was missing, though)