Тестовый пример внешней библиотеки OSCPack в проекте Eclipse

Может кто-нибудь объяснить мне, как использовать библиотеку oscpack в проекте, основанном на рабочей области Eclipse? Я создал объектные файлы с помощью make, добавил каталоги ip и osc в дерево моего проекта и добавил эти каталоги в список путей для включения в настройках проекта> C / C ++ Build> Настройки> GCC C ++ Compiler> Includes.

Я не смог заставить его работать в Eclipse или компиляторе командной строки g ++. У меня заканчиваются идеи.

Кодом является SimpleReceive.cpp с сайта oscpack.

/*
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;
}

Консольный вывод:

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)

2

Решение

Так что вам нужно было настроить пути и параметры компилятора / компоновщика.

На моем Ubuntu Box, после apt-get install liboscpack-dev он скомпилирован нормально, используя следующие параметры:

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

В вашем ящике вам может понадобиться добавить путь к библиотеке, например,

-L /usr/local/lib/oscpack

(Я добавил #include <cstring> чего не хватало, хотя)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]