1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!--Converted with LaTeX2HTML 2002-2-1 (1.70)
original version by: Nikos Drakos, CBLU, University of Leeds
* revised and updated by: Marcus Hennecke, Ross Moore, Herb Swan
* with significant contributions from:
Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
<HTML>
<HEAD>
<TITLE>Writing the Client</TITLE>
<META NAME="description" CONTENT="Writing the Client">
<META NAME="keywords" CONTENT="users_guide">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">
<META NAME="Generator" CONTENT="LaTeX2HTML v2002-2-1">
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
<LINK REL="STYLESHEET" HREF="users_guide.css">
<LINK REL="next" HREF="node46.html">
<LINK REL="previous" HREF="node44.html">
<LINK REL="up" HREF="node41.html">
<LINK REL="next" HREF="node46.html">
</HEAD>
<BODY >
<DIV CLASS="navigation"><!--Navigation Panel-->
<A NAME="tex2html1241"
HREF="node46.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A>
<A NAME="tex2html1235"
HREF="node41.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A>
<A NAME="tex2html1229"
HREF="node44.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A>
<A NAME="tex2html1237"
HREF="node14.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A>
<A NAME="tex2html1239"
HREF="node317.html">
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html1242"
HREF="node46.html">Final Remarks</A>
<B> Up:</B> <A NAME="tex2html1236"
HREF="node41.html">Hello World Tutorial</A>
<B> Previous:</B> <A NAME="tex2html1230"
HREF="node44.html">Writing the Implementation</A>
<B> <A NAME="tex2html1238"
HREF="node14.html">Contents</A></B>
<B> <A NAME="tex2html1240"
HREF="node317.html">Index</A></B>
<BR>
<BR></DIV>
<!--End of Navigation Panel-->
<H1><A NAME="SECTION02340000000000000000"></A><A NAME="1558"></A>
<BR>
Writing the Client
</H1>
<P>
We will write the client in the main hello/ subdirectory.
The main program will be written in C.
File hello.c is as follows:
<P>
<BR>
<PRE CLASS="verbatim">#include <stdio.h>
#include "Hello_World.h"
int main(int argc, char** argv)
{
Hello_World h = Hello_World__create();
char* msg = Hello_World_getMsg(h);
printf("%s\n", msg);
Hello_World_deleteRef(h);
free(msg);
}
</PRE></td></tr></table></blockquote>
<P>
This code creates the Hello_World object, calls the getMsg() method,
prints the ubiquitous saying, decrements the reference count for
the object, and frees the message string.
<P>
There are a few details worth noting here. The C bindings
generate function names by combining packages, classes, and method names
with underscores (e.g. <TT>Hello_World_getMsg()</TT>. Whenever you
see double underscores<A NAME="1561"></A> in Babel generated symbols, they indicate something
built-in to (and sometimes specific to) the language binding.
The <TT>_create()</TT> method is built-in to every instantiatable class
defined in SIDL, triggering the creation of Babel internal data structures
as well as the constructor of the actual object implementation.
<P>
To generate<A NAME="1563"></A> the C glue code necessary to call the library,
we run the Babel tool again, this time specifying C as the target language:
<P>
<BLOCKQUOTE>
<TT> <TT>%</TT> <TT><B>babel -client=C hello.sidl</B></TT>
<BR>
</TT></BLOCKQUOTE>or simply
<BLOCKQUOTE>
<TT> <TT>%</TT> <TT><B>babel -cC hello.sidl</B></TT>
<BR>
</TT></BLOCKQUOTE>
<P>
The ``<TT>-cC</TT>'' flag,
or its equivalent long-form ``<TT>-client=C</TT>'', tells the
Babel code generator to create only the C stub calling code,
not the entire library implementation.
The library libhello.so already contains the
necessary IOR, skeleton, and implementation object files.
We compile the hello program using the following GNU Make
Makefile:<A NAME="1572"></A>
<P>
<BR>
<PRE CLASS="verbatim">.c.o:
gcc -I$(HOME)/babel/include -Ilib -c $<
include babel.make
OBJS = hello.o ${STUBSRCS:.c=.o}
hello: ${OBJS}
gcc ${OBJS} -o $@ \
-Rlib -Llib -lhello \
-R$(HOME)/babel/lib -L$(HOME)/babel/lib -lsidl
clean:
${RM} *.o hello
</PRE></td></tr></table></blockquote>
<P>
Note that the ``-R'' flags tell the dynamic library loader where to find the
hello and sidl shared libraries.
You could achieve the same behavior through environment
variables such as <TT>LD_LIBRARY_PATH</TT>.
On some machines and compilers (notably linux-gcc-3.0) the -R flag
is no longer supported, so you will have to modify the
appropriate environment variable to find the shared library.
<P>
Finally, we make the executable and run it:
<P>
<BLOCKQUOTE>
<TT> <TT>%</TT> <TT><B>make hello</B></TT>
<BR><TT>%</TT> <TT><B>./hello</B></TT>
<BR>
Hello World
</TT></BLOCKQUOTE>
<P>
<DIV CLASS="navigation"><HR>
<!--Navigation Panel-->
<A NAME="tex2html1241"
HREF="node46.html">
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A>
<A NAME="tex2html1235"
HREF="node41.html">
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A>
<A NAME="tex2html1229"
HREF="node44.html">
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A>
<A NAME="tex2html1237"
HREF="node14.html">
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A>
<A NAME="tex2html1239"
HREF="node317.html">
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html1242"
HREF="node46.html">Final Remarks</A>
<B> Up:</B> <A NAME="tex2html1236"
HREF="node41.html">Hello World Tutorial</A>
<B> Previous:</B> <A NAME="tex2html1230"
HREF="node44.html">Writing the Implementation</A>
<B> <A NAME="tex2html1238"
HREF="node14.html">Contents</A></B>
<B> <A NAME="tex2html1240"
HREF="node317.html">Index</A></B> </DIV>
<!--End of Navigation Panel-->
<ADDRESS>
<br><br>babel-0.10.2<br>users_guide Last Modified 2005-03-23<br><br><a href="http://www.llnl.gov/CASC/components">http://www.llnl.gov/CASC/components</a><br><a href="mailto:components@llnl.gov">components@llnl.gov</a>
</ADDRESS>
</BODY>
</HTML>
|