Home Comments

Problem compiling C++

bobcbobc Member Bob CowderyOrganization: PersonalProject: Software Radio
Hi

I have been using Ice with Python for some time with good results. I now need a C++ node. I'm no doubt doing something stupid but would appreciate it if someone could put me straight.

I'm using Eclipse on Ubuntu 8.04. This is a very simple test node with a test interface just so I can get some comms going from my Python node to C++ node.

Here is the Ice def:
#ifndef DISPLAYS_ICE
#define DISPLAYS_ICE

module AcornDisplays
{
    
    interface Displays
    {
        void data(string display);
    };

};
#endif

and here is the code.
#include <Ice/Ice.h>
#include <IceStorm/IceStorm.h>
#include "displays.h"

using namespace std;
using namespace AcornDisplays;

class DisplaysI : virtual public Displays {

public:
	virtual void data(const string& s, const Ice::Current&);
};

void DisplaysI::data(const string& s, const Ice::Current&) {
	cout << "Got some data!";
}

int main(int argc, char* argv[])
{
	int status = 0;

	Ice::CommunicatorPtr ic;
	IceStorm::TopicManagerPrx topicManager;
	Ice::ObjectPrx proxy;
	Ice::ObjectAdapterPtr adapter;
	IceStorm::TopicPrx topic;
	try {
		ic = Ice::initialize(argc, argv);
		Ice::ObjectPrx obj = ic->propertyToProxy("TopicManager.Proxy");
		topicManager = IceStorm::TopicManagerPrx::checkedCast(obj);
		adapter = ic->createObjectAdapter("Display.Subscriber");
		DisplaysPtr display = new DisplaysI;
		proxy = adapter->addWithUUID(display)->ice_oneway();
	} catch (const Ice::Exception& e) {
		cerr << e << endl;
		status = 1;
	}

	try {
		topic = topicManager->retrieve("Display");
		IceStorm::QoS qos;
		topic->subscribeAndGetPublisher(qos, proxy);
	}
	catch (const IceStorm::NoSuchTopic&) {
		cout << "Error! No topic found!";
		exit(1);
	}

	try {
		adapter->activate();
	} catch (const Ice::Exception& e) {
		cerr << e << endl;
		status = 1;
	}

	ic->waitForShutdown();
	topic->unsubscribe(proxy);

	return status;

}
I am linking with Ice, IceUtil and IceStorm. I am getting the following link errors which I don't understand.
/home/bob/dev/projects/acorn-sdr/ice/displays.h undefined reference to `vtable for AcornDisplays::Displays'	displays
/home/bob/dev/projects/acorn-sdr/ice/displays.h undefined reference to `VTT for AcornDisplays::Displays'	displays
/opt/Ice-3.3.0/include/Ice/Handle.h undefined reference to `IceInternal::upCast(AcornDisplays::Displays*)'	displays
/opt/Ice-3.3.0/include/Ice/Handle.h undefined reference to `IceInternal::upCast(AcornDisplays::Displays*)'	displays

Thanks
Bob

Comments

  • dwaynedwayne St. John's, NewfoundlandMember Dwayne BooneOrganization: ZeroC, Inc.Project: Internet Communications Engine
    It sounds like you are not compiling the generated .cpp file (displays.cpp?) or just not linking with the resultant object file if you are compiling it.
  • bobcbobc Member Bob CowderyOrganization: PersonalProject: Software Radio
    Thanks for the prompt reply. As far as I can tell everything is compiled and linked. I tried it from the makefile rather than the IDE. I get a lot more errors so I have just given the first few.
    [email protected]:~/dev/projects/acorn-sdr/src/displays/Release$ make
    Building file: ../display_main.cpp
    Invoking: GCC C++ Compiler
    g++ -I/home/bob/dev/projects/acorn-sdr/src/displays -I/home/bob/dev/projects/acorn-sdr/ice -I/opt/Ice-3.3.0/include -O3 -Wall -c -fmessage-length=0 -MMD -MP -MF"display_main.d" -MT"display_main.d" -o"display_main.o" "../display_main.cpp"
    Finished building: ../display_main.cpp
     
    Building target: displays
    Invoking: GCC C++ Linker
    g++ -L/opt/Ice-3.3.0/lib -o"displays"  ./display_main.o   -lIce -lIceUtil -lIceStorm
    ./display_main.o: In function `main':
    display_main.cpp:(.text+0x425): undefined reference to `IceInternal::upCast(AcornDisplays::Displays*)'
    display_main.cpp:(.text+0x515): undefined reference to `IceInternal::upCast(AcornDisplays::Displays*)'
    display_main.cpp:(.text+0xb64): undefined reference to `IceInternal::upCast(AcornDisplays::Displays*)'
    
  • matthewmatthew NL, CanadaMember Matthew NewhookOrganization: ZeroC, Inc.Project: Internet Communications Engine ✭✭✭
    g++ -L/opt/Ice-3.3.0/lib -o"displays" ./display_main.o -lIce -lIceUtil -lIceStorm

    Surely display.o (or whatever the name of the translated slice file is) is missing from that list.
  • bobcbobc Member Bob CowderyOrganization: PersonalProject: Software Radio
    Of course it is. I was just blind and forgot about the auto-generated file. Sorry for the noise.
Sign In or Register to comment.