Я установил omniORB для C ++ и скачал его отсюда http://omniorb.sourceforge.net/download.html. Я пытался собрать эту программу (main. cpp):
#include "echo.hh"
#ifdef HAVE_STD
#include <iostream>
using namespace std;
#else
#include <iostream.h>
#endif
class Echo_i : public POA_Echo {
public:
inline Echo_i() {}
virtual ~Echo_i() {}
virtual char* echoString(const char* mesg);
};
char* Echo_i::echoString(const char* mesg) {
return CORBA::string_dup(mesg);
}
static void hello(Echo_ptr e) {
if( CORBA::is_nil(e) ) {
cerr << "hello: The object reference is nil!" << endl;
return;
}
CORBA::String_var src = (const char*) "Hello!";
CORBA::String_var dest = e->echoString(src);
cout << "I said, \"" << (char*)src << "\"." << endl
<< "The Echo object replied, \"" << (char*)dest <<"\"." << endl;
}
int main(int argc, char** argv) {
try {
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
CORBA::Object_var
obj = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var poa = PortableServer::POA::_narrow(obj);
PortableServer::Servant_var<Echo_i> myecho = new Echo_i();
PortableServer::ObjectId_var myechoid = poa->activate_object(myecho);
Echo_var myechoref = myecho->_this();
PortableServer::POAManager_var pman = poa->the_POAManager();
pman->activate();
hello(myechoref);
orb->destroy();
}
catch (CORBA::SystemException& ex) {
cerr << "Caught CORBA::" << ex._name() << endl;
}
catch (CORBA::Exception& ex) {
cerr << "Caught CORBA::Exception: " << ex._name() << endl;
}
return 0;
}
Создал файл echo.idl:
interface Echo {
string echoString(in string mesg);
};
и запустил omniidl -bcxx echo.idl
. Когда я запускаю g++ main.cpp -o main
, он возвращает:
/usr/bin/ld: /tmp/ccQ9WBKJ.o: in function `Echo_i::echoString(char const*)':
main.cpp:(.text+0x18): undefined reference to `CORBA::string_dup(char const*)'
... ~50 lines of linker message
collect2: error: ld returned 1 exit status
GNU Linker не может получить определения omniORB, почему? Как решить эту проблему и получить двоичный файл?