For Programmers: Free Programming Magazines  


Home > Archive > Unix Programming > February 2007 > Creating and sharing a c++ shared library ?









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Creating and sharing a c++ shared library ?
vivekian

2007-02-25, 7:06 pm

Hi ,

These are the steps i followed to create a shared library

1. Compiled the cpp files

g++ -c -g -fpic -Wall -Wno-deprecated SockException.cpp -o
SockException.o
g++ -c -g -fpic -Wall -Wno-deprecated Socket.cpp -o Socket.o
g++ -c -g -fpic -Wall -Wno-deprecated TcpSocket.cpp -o TcpSocket.o
g++ -c -g -fpic -Wall -Wno-deprecated UdpSocket.cpp -o UdpSocket.o
g++ -c -g -fpic -Wall -Wno-deprecated SocketReaderWriter.cpp -o
SocketReaderWriter.o
g++ -shared -Wl,-soname,libcppsocket.so.1 -o libcppsocket.so.1.0.1
SockException.o Socket.o TcpSocket.o UdpSocket.o SocketReaderWriter.o -
lc

2. Copied the compiled libcppsocket.so.1 to the directories /usr/lib

3. Moved the header files to the directories /usr/include and /usr/
local/include

4. To test the compiled library , i wrote a small program

#include <TcpSocket.h>

int main ()
{
TcpSocket sock ;
}

where TcpSocket.h is one of the header files copied to /usr/include

5. Compiling this test program

g++ main.cpp
/tmp/ccPqeVa9.o: In function `main':
main.cpp:(.text+0x8a): undefined reference to `TcpSocket::TcpSocket()'
main.cpp:(.text+0x95): undefined reference to
`TcpSocket::~TcpSocket()'
collect2: ld returned 1 exit status

gives the above error.

This i suppose indicates that the library has to be linked. But the
following doesnt help
g++ main.cpp -llibcppsocket

What am i missing here ?

Thanks in advance,
vivekian

Markus Kossmann

2007-02-25, 7:06 pm

vivekian wrote:

> Hi ,
>
> These are the steps i followed to create a shared library
>
> 1. Compiled the cpp files
>
> g++ -c -g -fpic -Wall -Wno-deprecated SockException.cpp -o
> SockException.o
> g++ -c -g -fpic -Wall -Wno-deprecated Socket.cpp -o Socket.o
> g++ -c -g -fpic -Wall -Wno-deprecated TcpSocket.cpp -o TcpSocket.o
> g++ -c -g -fpic -Wall -Wno-deprecated UdpSocket.cpp -o UdpSocket.o
> g++ -c -g -fpic -Wall -Wno-deprecated SocketReaderWriter.cpp -o
> SocketReaderWriter.o
> g++ -shared -Wl,-soname,libcppsocket.so.1 -o libcppsocket.so.1.0.1
> SockException.o Socket.o TcpSocket.o UdpSocket.o SocketReaderWriter.o -
> lc
>
> 2. Copied the compiled libcppsocket.so.1 to the directories /usr/lib
>
> 3. Moved the header files to the directories /usr/include and /usr/
> local/include
>
> 4. To test the compiled library , i wrote a small program
>
> #include <TcpSocket.h>
>
> int main ()
> {
> TcpSocket sock ;
> }
>
> where TcpSocket.h is one of the header files copied to /usr/include
>
> 5. Compiling this test program
>
> g++ main.cpp
> /tmp/ccPqeVa9.o: In function `main':
> main.cpp:(.text+0x8a): undefined reference to `TcpSocket::TcpSocket()'
> main.cpp:(.text+0x95): undefined reference to
> `TcpSocket::~TcpSocket()'
> collect2: ld returned 1 exit status
>
> gives the above error.
>
> This i suppose indicates that the library has to be linked. But the
> following doesnt help
> g++ main.cpp -llibcppsocket
>
> What am i missing here ?

The linker looks only for .so and .a files ( without any version number)
Create a link libcppsocket.so -> libcppsocket.so.1.0.1.

Paul Pluzhnikov

2007-02-25, 7:06 pm

"vivekian" <viveklinux@gmail.com> writes:

> These are the steps i followed to create a shared library


These steps are un-necessarily complicated.
You are (apparently) following some DSO-HOWTO, but without
understanding why things are done in "complicated" way, and whether
that complicated way is appropriate for your situation.

> g++ -shared -Wl,-soname,libcppsocket.so.1 -o libcppsocket.so.1.0.1
> SockException.o Socket.o TcpSocket.o UdpSocket.o SocketReaderWriter.o -
> lc


Until you need "external library versioning", I suggest you use
"simple" way:

g++ -shared -o libcppsocket.so \
SockException.o Socket.o TcpSocket.o UdpSocket.o SocketReaderWriter.o

> 5. Compiling this test program
>
> g++ main.cpp
> /tmp/ccPqeVa9.o: In function `main':
> main.cpp:(.text+0x8a): undefined reference to `TcpSocket::TcpSocket()'
> main.cpp:(.text+0x95): undefined reference to
> `TcpSocket::~TcpSocket()'
> collect2: ld returned 1 exit status
>
> gives the above error.
>
> This i suppose indicates that the library has to be linked.


Correct.

> But the following doesnt help
> g++ main.cpp -llibcppsocket


And it shouldn't help. Provided /usr/lib/libcppsocket.so exists,
correct link line is:

g++ main.cpp -lcppsocket

> What am i missing here ?


Well, for starters you didn't tell us (nor paid attention to)
the error linker gave you, which likely was:

/usr/bin/ld: cannot find -llibcppsocket

Please read "info gcc" to understand what library the linker will
search for given '-llibcppsocket' argument. Hint libcppsocket.*
it is not.

Cheers,
--
In order to understand recursion you must first understand recursion.
Remove /-nsp/ for email.
vivekian

2007-02-25, 7:06 pm

On Feb 25, 2:19 pm, Paul Pluzhnikov <ppluzhnikov-...@charter.net>
wrote:
> "vivekian" <vivekli...@gmail.com> writes:
>
> These steps are un-necessarily complicated.
> You are (apparently) following some DSO-HOWTO, but without
> understanding why things are done in "complicated" way, and whether
> that complicated way is appropriate for your situation.
>
>
> Until you need "external library versioning", I suggest you use
> "simple" way:
>
> g++ -shared -o libcppsocket.so \
> SockException.o Socket.o TcpSocket.o UdpSocket.o SocketReaderWriter.o
>
>
>
>
>
> Correct.
>
>
> And it shouldn't help. Provided /usr/lib/libcppsocket.so exists,
> correct link line is:
>
> g++ main.cpp -lcppsocket
>
>
> Well, for starters you didn't tell us (nor paid attention to)
> the error linker gave you, which likely was:
>
> /usr/bin/ld: cannot find -llibcppsocket


Yes, you are right , i didnt mention that , but yes i did notice it.
>
> Please read "info gcc" to understand what library the linker will
> search for given '-llibcppsocket' argument. Hint libcppsocket.*
> it is not.


I did. This is the relevant portion i guess :
"The only difference between using an -l option and specifying a file
name is that -l surrounds library with lib and .a and searches
several directories"

That solved the problem. It compiles fine. I was following a HowTo
without understanding :) .

Thanks a ton . Appreciate it.

vivekian

Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com