[flext] problem with static linking flext on Linux

Thomas Grill gr at grrrr.org
Mon Apr 8 00:06:46 CEST 2013


>
> So, just to make sure I understand correctly, flextv by default  
> links everything statically, correct?
>
By default, yes.

But there are several build modes you can specify explicitly:

build.sh pd gcc build-release-single  (the default case)
build.sh pd gcc build-release-multi
build.sh pd gcc build-release-shared
(and same with debug instead of release)

If used to build flext itself,
the first two versions build static single-threaded (libflext-pd_s.a),  
or multi-threaded (libflext-pd_t.a) libraries.
and the last one builds a shared multi-threaded library (libflext- 
pd.so).

If used with an flext-based external, these specifications refer to  
the respective flext libraries linked to.

You can also specify the build types using the BUILDTYPE variable  
(single, multi, shared or all) in package.txt
The BUILDMODE variable refers to the release or debug variant, or  
"all" for both.

all the best,
gr~~~


> On Apr 7, 2013 4:20 PM, "Thomas Grill" <gr at grrrr.org> wrote:
> Hi Ico,
> in your build example you cited the following line of console output:
>
> g++ -pthread -shared  -Wl,-S -L../../../pd/bin -L./libbuild/lib -o  
> pd-linux/release-single/fluid~.pd_linux   pd-linux/release-single/ 
> main.opp  ../../grill/trunk/flext/libbuild/lib/libflext-pd_s.a* - 
> lfluidsynth -lflext-pd_s
>
> Therein, -lflext-pd_s can never cause dynamic linking, because the  
> file libflext-pd_s.a is not a shared library, but rather a static  
> one (at least if it has been built using the flext build system).
> There is no libflext-pd_s.so which a dynamic linker could refer to.
>
> So, if the line would be
> g++ -pthread -shared  -Wl,-S -L../../../pd/bin -L./libbuild/lib -o  
> pd-linux/release-single/fluid~.pd_linux   pd-linux/release-single/ 
> main.opp -L../../grill/trunk/flext/libbuild/lib -lfluidsynth -lflext- 
> pd_s
> (notice the -L../../etc.) linking should work as expected.
> This is possible by using
>
> LIBPATH=-L../../grill/trunk/flext/libbuild/lib sh ../../grill/trunk/ 
> flext/build.sh pd gcc
>
> without your modification "LIBS= ../../grill/trunk/flext/libbuild/ 
> lib/libflext-pd_s.a*" in package.txt.
>
> The subfolder name you use, libbuild/lib, lets me assume that you  
> are not using the flext build system to build the flext binaries.  
> Then of course, you could also end up with a  libflext-pd_s.so or  
> whatever, but this is not as intended by me.
>
> --
> Thomas Grill
> http://grrrr.org
>
>
>
> Am 07.04.2013 um 21:18 schrieb Ivica Bukvic:
>
>> The problem is that you can not in any shape or form disable  
>> dynamic linking that is added at the end of the LIBS variable by  
>> the build.sh script even if you declare your own custom static  
>> library and even if you try to override LIBS variable in the  
>> package.txt file. I will try the LIBPATH but I'm not sure that will  
>> work because on Linux when you try to link a library, as far as I  
>> understand, it has to have its location cached prior to compiling  
>> for linker to be able to find it.
>>
>> The other problem is that I still don't know what kind of potential  
>> problems would an external have by being compiled both against the  
>> static and dynamic libraries the same time because the build script  
>> does not allow me to easily remove the linking of the dynamic  
>> library even if I have declared a static library (as explained  
>> above).
>>
>> On Apr 7, 2013 2:50 PM, "Thomas Grill" <gr at grrrr.org> wrote:
>> Hi Ico,
>> i still don't get the problem - since static and dynamic library  
>> versions of flext have different names, so they cannot possibly be  
>> confused by the build system.
>> As i see it, an easy solution could be to point the flext build  
>> system to the location of your build of the flext library, e.g. as in
>>
>> LIBPATH=-L../flext/pd-darwin/release-single sh ../flext/build.sh pd  
>> gcc
>>
>> Does this solve the issue?
>> gr~~~
>>
>> --
>> Thomas Grill
>> http://grrrr.org
>>
>>
>>
>> Am 07.04.2013 um 15:03 schrieb Ivica Bukvic:
>>
>>> I am trying not to require sudo access while building pd-l2ork deb  
>>> and trying to include flext- dependent libs, so installing system- 
>>> wide is not an option. The problem for me, however, is not  
>>> necessarily that the flext installer is not finding the dynamic  
>>> library but that it keeps trying to link it even though I've  
>>> manually statically linked it. In other words, the suggested  
>>> solution you have for OSX does not work because package.txt is  
>>> read before LIBS variable is appended with -ldynamic lib.so, so  
>>> package.txt can never truly (entirely) override it. I am also  
>>> wondering if building an external that links both static and  
>>> dynamic library is going to work on a system that does not have  
>>> flext installed (even If it was successfully built on a dev system).
>>>
>>> Is there was a way to define a variable just like you have SHARED  
>>> variable for the flext installer this would solve the problem  
>>> (e.g. STATIC). Another way would be to simply have the installer  
>>> read package.txt file after it has finished appending LIBS  
>>> variable, so one could truly override LIBS variable that contains  
>>> dynamic linker command.
>>>
>>> Another, more complicated solution would be to in addition to  
>>> having LIBS override option to dynamically provide info to the  
>>> package.txt whether the build is single, multi, or shared, so a  
>>> manual LIBS entry would look like LIBS=<manual-path>/STATICLIB  
>>> where the STATICLIB variable would be automatically converted at  
>>> compile-time to an appropriate version of static library (single,  
>>> multi, etc).
>>>
>>> Any chance this could be implemented sometime soon? If so, it  
>>> would make including flext externals in pd-l2ork Debian package a  
>>> lot easier.
>>>
>>> Thanks!
>>>
>>> On Apr 7, 2013 6:58 AM, "Thomas Grill" <gr at grrrr.org> wrote:
>>> Hi Ico,
>>> i can't really remember what i wrote on the fluid~ topic. I guess  
>>> that was years ago and the context might have changed in the  
>>> meantime.
>>> I think that your case should be easy to resolve.
>>>
>>> First, flext libraries libflext-pd_s.a or libflext-pd_t.a are  
>>> always static, while libflext-pd.dylib is the shared version.
>>> Consequently linking with the -lflext-pd_s option will always be  
>>> static.
>>>
>>> In your console printout the libflext-pd_s.a is not found - most  
>>> probably because it is not installed in any of the standard system  
>>> locations (like /usr/local/lib).
>>> Is there any reason why you haven't installed them? This is  
>>> normally done by calling the flext build system with  "sudo sh  
>>> build.sh pd gcc install" from the flext folder.
>>>
>>> hope this helps! all the best,
>>> gr~~~
>>>
>>> --
>>> Thomas Grill
>>> http://grrrr.org
>>>
>>>
>>>
>>> Am 07.04.2013 um 08:21 schrieb Ivica Ico Bukvic:
>>>
>>>> Hey Thomas,
>>>>
>>>> Hope all is well. I followed some of your previous posts on this  
>>>> topic that pertain to OSX and tried adjusting project.txt file  
>>>> for a custom build of fluid~ external for pd but am having no  
>>>> luck in suppressing -lflext-pd_* being tacked at the end of the  
>>>> build process. Below are my packa.txt file and the output:
>>>>
>>>> NAME=fluid~
>>>> PDPATH=../../../pd
>>>> LIBS= ../../grill/trunk/flext/libbuild/lib/libflext-pd_s.a*
>>>> CFLAGS+=-I../../grill/trunk/flext/source/
>>>> BUILDDIR=build
>>>> SRCDIR=fluid
>>>> SRCS=main.cpp
>>>>
>>>> (I am trying to make the build as automated as possible, hence  
>>>> the use of wildcard)
>>>>
>>>> The output is as follows:
>>>>
>>>>
>>>> ico at zen:~/Downloads/PureData/pure-data/externals/footils/fluid 
>>>> $ ../../grill/trunk/flext/build.sh pd gcc build
>>>> make -f ../../grill/trunk/flext/buildsys/gnumake-sub.mak   
>>>> PLATFORM=lnx RTSYS=pd COMPILER=gcc BUILDPATH=../../grill/trunk/ 
>>>> flext/buildsys/ PKGINFO=package.txt BUILDCLASS=ext  
>>>> USRCONFIG=config.txt USRMAKE=build/gnumake-lnx-gcc.inc  
>>>> TARGETMODE=release TARGETTYPE=single _build_
>>>> make[1]: Entering directory `/home/ico/Downloads/PureData/pure- 
>>>> data/externals/footils/fluid'
>>>> g++ -pthread -shared  -Wl,-S -L../../../pd/bin -L./libbuild/lib - 
>>>> o pd-linux/release-single/fluid~.pd_linux   pd-linux/release- 
>>>> single/main.opp  ../../grill/trunk/flext/libbuild/lib/libflext- 
>>>> pd_s.a* -lfluidsynth -lflext-pd_s
>>>> /usr/bin/ld: cannot find -lflext-pd_s
>>>> collect2: ld returned 1 exit status
>>>> make[1]: *** [pd-linux/release-single/fluid~.pd_linux] Error 1
>>>> make[1]: Leaving directory `/home/ico/Downloads/PureData/pure- 
>>>> data/externals/footils/fluid'
>>>> make: *** [build-release-single] Error 2
>>>>
>>>> If I manually run the last line without lflext-pd_s, the external  
>>>> builds properly and works just fine. Any pointers as to how I  
>>>> could suppress the automatic dynamic linking done by flext build  
>>>> system?
>>>>
>>>> Also, any suggestions how to make static linking reflect the kind  
>>>> of build I wish to use (single/multi/etc.)?
>>>>
>>>> Please advise.
>>>>
>>>> -- 
>>>> Ivica Ico Bukvic, D.M.A
>>>> Composition, Music Technology
>>>> Director, DISIS Interactive Sound & Intermedia Studio
>>>> Director, L2Ork Linux Laptop Orchestra
>>>> Head, ICAT IMPACT Studio
>>>> Virginia Tech
>>>> Department of Music
>>>> Blacksburg, VA 24061-0240
>>>> (540) 231-6139
>>>> (540) 231-5034 (fax)
>>>> disis.music.vt.edu
>>>> l2ork.music.vt.edu
>>>> ico.bukvic.net
>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://grrrr.org/pipermail/flext/attachments/20130408/38973e3e/attachment.htm>


More information about the flext mailing list