Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 05 Feb 2009 09:11:39 -0800
From:      Julian Elischer <julian@elischer.org>
To:        pluknet <pluknet@gmail.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: linking .a lib with another library
Message-ID:  <498B1DCB.801@elischer.org>
In-Reply-To: <a31046fc0902050436k49b3f784xd624188e2bd76ca8@mail.gmail.com>
References:  <a31046fc0902050301k44955c40lf0cd379a376ee7e5@mail.gmail.com> <a31046fc0902050436k49b3f784xd624188e2bd76ca8@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
pluknet wrote:
> 2009/2/5 pluknet <pluknet@gmail.com>:
>> Hi.
>>
>> The problem is:
>>
>> I have a program which is statically linked to my static lib during a build.
>> The lib is in turn uses kvm*() calls, hence it should be linked with libkvm.

in static linking order is important..
you need to put libkvm after the library that has the refrences.
(At least that is my first reaction)

>>
>> During the build of my binaries which are linked to my libucron.a I
>> get the following:
>>
>> /usr/home/pluknet/svn/ucron/ksucron/crond/../lib/libucron.a(misc.o)(.text+0x6e):
>> In function `check_pidfile':
>> : undefined reference to `kvm_open'
>> /usr/home/pluknet/svn/ucron/ksucron/crond/../lib/libucron.a(misc.o)(.text+0x8b):
>> In function `check_pidfile':
>> : undefined reference to `kvm_getprocs'
>> /usr/home/pluknet/svn/ucron/ksucron/crond/../lib/libucron.a(misc.o)(.text+0xbe):
>> In function `check_pidfile':
>> : undefined reference to `kvm_getprocs'
>> /usr/home/pluknet/svn/ucron/ksucron/crond/../lib/libucron.a(misc.o)(.text+0x106):
>> In function `check_pidfile':
>> : undefined reference to `kvm_close'
>> *** Error code 1
>>
>> Ok, if I add SHLIB_MAJOR directive in lib/Makefile (or remove any kvm*
>> references) then all is ok.
>> But the lib is used to be static. So the question is can I somehow
>> link two .a libraries?
>> e.g. libkvm.a + libucron.a + my binaries.
>>
> 
> Ok, I finally got it:
> gcc crond/crond.o lib/libucron.a /usr/lib/libkvm.a
> -L/usr/local/lib/mysql -lmysqlclient
> 
> or in BNF (bmake normal form):
> LDADD+=         -lmysqlclient -lucron ${LIBKVM}
> 
> $ ldd crond/crond
> crond/crond:
>         libmysqlclient.so.14 =>
> /usr/local/lib/mysql/libmysqlclient.so.14 (0x28080000)
>         libc.so.6 => /lib/libc.so.6 (0x280d5000)
>         libcrypt.so.3 => /lib/libcrypt.so.3 (0x281ba000)
>         libm.so.4 => /lib/libm.so.4 (0x281d2000)
>         libz.so.3 => /lib/libz.so.3 (0x281e8000)
> 
> The only drawback is that I had to add that to crond/Makefile, not to
> lib/Makefile.
> crond knows nothing about kvm calls and now it has to (and lib does vice versa).
> 




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?498B1DCB.801>