[CIG-SHORT] adding a static library

Brad Aagaard baagaard at usgs.gov
Mon Apr 9 10:13:12 PDT 2012


Birendra,

Did you build libmatvec.a yourself or are you limited to some version 
that was supplied to you as a binary? If you built it, just add -fPIC as 
a flag on the build (CFLAG, CXXFLAG, etc) as the error message indicates 
and you should be fine. If you did not build it, then I think you are 
likely stuck because in order for the linker to create the PyLith shared 
library, it needs the static library to provide object files with 
position independent code (PIC).

Brad


On 04/09/2012 09:58 AM, Birendra jha wrote:
> Brad,
>
> So can I link Pylith to a static library? I am sorry for this confusion but I still didn't understand. I don't want to create static modules of pylith such as _problemsmodules.a, I just want to call a function present in an external static library. Where do I supply this external library i.e. which Makefile.am?
>
> So far I was editing build/pylith/pylith-1.6.3/libsrc/pylith/Makefile.am
>
> libpylith_la_LDFLAGS =  $(AM_LDFLAGS) $(PYTHON_LA_LDFLAGS) \
>             -Wl,-rpath -Wl,$(MATVEC)/lib -L$(MATVEC)/lib
> INCLUDES += -I$(MATVEC)/include
> libpylith_la_LIBADD += -lmatvec
>
> where libmatvec.a is a static library. Paths are correct.
>
> I get make error:
>
>   -Wl,-soname -Wl,libpylith.so.0 -o .libs/libpylith.so.0.0.0
> /usr/bin/ld: /home/user/GPRS08/LIBS/Libs/libGPRSLinear.a(GlobalCPRPre.o): relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile with -fPIC
> /home/user/GPRS08/LIBS/Libs/libGPRSLinear.a: could not read symbols: Bad value
> collect2: ld returned 1 exit status
> make[4]: *** [libpylith.la] Error 1
> make[4]: Leaving directory `/home/user/build/pylith/pylith-build/libsrc/pylith'
> make[3]: *** [all-recursive] Error 1
> make[3]: Leaving directory `/home/user/build/pylith/pylith-build/libsrc/pylith'
> make[2]: *** [all-recursive] Error 1
> make[2]: Leaving directory `/home/user/build/pylith/pylith-build/libsrc'
> make[1]: *** [all-recursive] Error 1
> make[1]: Leaving directory `/home/user/build/pylith/pylith-build'
> make: *** [all] Error 2
>
> Note I tried this with a shared library (Test below) and it works. Of course, I don't have shared library or source code of the matvec library that I am interested in combining with Pylith.
>
> Thanks
> Birendra
>
> --- On Sun, 4/8/12, Brad Aagaard<baagaard at usgs.gov>  wrote:
>
>> From: Brad Aagaard<baagaard at usgs.gov>
>> Subject: Re: adding a static library
>> To: "Birendra jha"<bjha7333 at yahoo.com>
>> Cc: cig-short at geodynamics.org
>> Date: Sunday, April 8, 2012, 8:43 AM
>> Birendra,
>>
>> The Python modules must be shared, because they are loaded
>> at runtime
>> from Python. This means that trying to generate
>> _problemsmodule.a will
>> never work. If you are customizing PyLith so that it needs
>> an additional
>> library, then you must call the routine from the code in the
>> Pylith
>> library and then add the external library to the link line.
>> You can
>> verify if symbols are just referenced or referenced and
>> resolved by
>> using the unix nm tool on the library. See the nm
>> documentation for more
>> details.
>>
>> Brad
>>
>>
>>
>> On 4/7/12 11:07 AM, Birendra jha wrote:
>>> Hi developers,
>>>
>>> I am trying to compile and install Pylith using a very
>> simple static library.
>>> //Test.cpp
>>> #include "Test.h"
>>> #include<cstdio>
>>> #include<iostream>
>>> using namespace std;
>>> Test::Test()
>>> {
>>>            x = 210;
>>> }
>>>
>>> int Test::add(int a, int b)
>>> {
>>>      cout<<x<<endl;
>>>      return a+b;
>>> }
>>>
>>> Test::~Test()
>>> {
>>> }
>>> //Test.h
>>> #if !defined(Test_h)
>>> #define Test_h
>>> class Test
>>> {
>>> public:
>>>      Test();
>>>      ~Test();
>>>            int add(int,int);
>>> private:
>>>     int x;
>>> };
>>> #endif
>>>
>>> Then g++ -c Test.cpp, then, ar crs libTest.a Test.o
>>> I placed libTest.a in $HOME/pylith/lib. I added the
>> library in pylith-1.6.3/libsrc/pylith/Makefile.am
>>>      libpylith_la_LIBADD += -lTest
>>> and put -static
>>> libpylith_la_LDFLAGS =  -static $(AM_LDFLAGS)
>> $(PYTHON_LA_LDFLAGS)
>>> I am trying to use it in the constructor of
>> Formulation,
>>>       Test test;
>>>       int i;
>>>       i=test.add(20,3);
>>> I include the Test.h in Formulation.cc.
>>>
>>> make,make install was fine. libpylith.a was created.
>> But I get runtime error:
>>> ImportError:
>> /home/user/pylith/lib/python2.7/site-packages/pylith/problems/_problemsmodule.so:
>> undefined symbol: _ZN4TestD1Ev
>>>
>>> I also tried adding the library in
>> pylith-1.6.3/modulesrc/problems/Makefile.am with -static.
>> This creates _problemsmodule.a but program still looks in
>> _problemsmodule.so for Test symbols.
>>>
>>> Note, I can get this working for a shared library i.e.
>> libTest.so
>>> I don't know what I am missing for the static library.
>>>
>>> Can you please help me?
>>>
>>> Thanks and regards
>>> Birendra
>>>
>>
>>
>



More information about the CIG-SHORT mailing list