Boost logo

Boost :

Subject: Re: [boost] building a run-time static version
From: Lorenzo Bettini (bettini_at_[hidden])
Date: 2009-08-18 18:15:31


Vladimir Prus wrote:
> Lorenzo Bettini wrote:
>
>> Vladimir Prus wrote:
>>> Lorenzo Bettini wrote:
>>>
>>>> Hi
>>>>
>>>> I was trying to build a static version of the regex library (boost
>>>> 1.39), issuing this command:
>>>>
>>>> ./bjam --build-dir=build_static --layout=system threading=single
>>>> runtime-link=static link=static
>>>>
>>>> but I always get this error:
>>>>
>>>> error: link=shared together with runtime-link=static is not allowed
>>>> error: such property combination is either impossible
>>>> error: or too dangerious to be of any use
>>>>
>>>> but why is it trying to use link=shared when I explicitly specified
>>>> link=static?
>>> You must have an ICU installed, and Boost.Regex tries to use that automatically.
>>> ICU only comes as shared library. You might wish to remove the ICU_PATH
>>> setting in project-config.jam or whenever it's is made.
>> Hi
>>
>> I removed the ICU reference from the project-config.jam, and managed to
>> build the library; however when I statically link to boost regex
>> library, I get
>>
>> libtool: link: g++ -g -O2 -static -o check-regexp check-regexp_cmd.o
>> check-regexp.o -L/opt/boost/lib -lboost_regex-gcc43-mt-1_39
>> ../gl/.libs/libgnu.a
>> /opt/boost/lib/libboost_regex-gcc43-mt-1_39.a(static_mutex.o): In
>> function `boost::scoped_static_mutex_lock::unlock()':
>> static_mutex.cpp:(.text+0x16): undefined reference to `pthread_mutex_unlock'
>> /opt/boost/lib/libboost_regex-gcc43-mt-1_39.a(static_mutex.o): In
>> function `boost::scoped_static_mutex_lock::lock()':
>>
>> thus the library was not linked with runtime-link=static, was it?
>
> I don't think this conclusion is right -- nothing above suggests any
> dependency on any shared library. Rather, the errors above mean
> that you have:
>
> 1. Failed to linked with boost.thread library
> 2. Failed to pass -pthreads to the compiler
>
>> Or at
>> least, it builds a multi-threaded version while I requested, with
>> threading=single a single threaded version...
>
> To begin with, you are requesting multithreaded library:
>
> -lboost_regex-gcc43-mt-1_39
>
> Here, "mt" stands for multithreaded. Then, it's is fairly unlikely
> that such a library would be produced if you say threading=single.

actually, I built regex with above bjam command line, and then run

sudo ./bjam install
warning: Building Boost.Regex with the optional Unicode/ICU support
disabled.
note: Please refer to the Boost.Regex documentation for more information
note: this is a strictly optional feature.
...patience...
...found 14569 targets...
...updating 5 targets...
common.copy /opt/boost/lib/libboost_regex-gcc43-mt-1_39.so.1.39.0
ln-UNIX /opt/boost/lib/libboost_regex-gcc43-mt.so
common.copy /opt/boost/lib/libboost_regex-gcc43-mt-1_39.a
ln-UNIX /opt/boost/lib/libboost_regex-gcc43-mt.a
ln-UNIX /opt/boost/lib/libboost_regex-gcc43-mt-1_39.so
...updated 5 targets...

thus, bjam install seems to install the -mt version, while I requested
to build the non threaded version... probably I'm doing something wrong
with bjam build/install?

> I would guess that -L/opt/boost/lib has something you previously
> installed, and if you run:

mh... no: I removed the /opt/boost/lib contents before running bjam
install, and as shown above, 'bjam install' installs the -mt version,
which shouldn't have been built, should it?

>
> ./bjam --build-dir=build_static --layout=system threading=single
> runtime-link=static link=static
>
> it puts new libraries in stage/lib. Did you copy non-MT versions
> to /opt/boost/lib? If so, you should be using -l option without "mt".
>

no I didn't because I thought 'bjam install' should have, but probably I
got the usage of bjam wrong... I'm used to autotools 'configure && make
&& make install', and probably bjam does not behave the same?

>> I actually need to build
>> a static version of boost which does not depend on any other dynamic
>> library (because, in turn, I need to build a completely static binary
>> that uses boost)... where am I going wrong?
>
> Hopefully the above explains this?

I found stage/lib/libboost_regex.a and copied it into /opt/boost/lib,
but again I get

g++ -static -I /opt/boost/include/ regex_use.cpp
/opt/boost/lib/libboost_regex.a -o regex_use_static
/opt/boost/lib/libboost_regex.a(static_mutex.o): In function
`boost::scoped_static_mutex_lock::unlock()':
static_mutex.cpp:(.text+0x16): undefined reference to `pthread_mutex_unlock'
/opt/boost/lib/libboost_regex.a(static_mutex.o): In function
`boost::scoped_static_mutex_lock::lock()':

so is libboost_regex.a still built using multithreading?

thanks in advance
        Lorenzo

-- 
Lorenzo Bettini, PhD in Computer Science, DI, Univ. Torino
ICQ# lbetto, 16080134     (GNU/Linux User # 158233)
HOME: http://www.lorenzobettini.it MUSIC: http://www.purplesucker.com
http://www.myspace.com/supertrouperabba
BLOGS: http://tronprog.blogspot.com  http://longlivemusic.blogspot.com
http://www.gnu.org/software/src-highlite
http://www.gnu.org/software/gengetopt
http://www.gnu.org/software/gengen http://doublecpp.sourceforge.net

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk