Boost logo

Boost :

Subject: Re: [boost] building a run-time static version
From: Vladimir Prus (vladimir_at_[hidden])
Date: 2009-08-19 01:04:29


Lorenzo Bettini wrote:

> 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?

Unlike autotool, 'install' is not something completely unrelated to
the regular build process. It's basically an ordinary target, and
therefore is affected by the properties you specify. You shoul
be using:

 ./bjam --build-dir=build_static --layout=system threading=single
 runtime-link=static link=static install

That is, passing all the same options. And, you don't need separate
build and install steps. The above command will both build and install
everything necessary.

>
>> 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?

Apparently. Presumably, that's because it was built this way. I would suggest you
remove both /opt/boost and stage directories and then either:

1. Run:

 ./bjam --layout=system threading=single runtime-link=static link=static install

(Note that I have omitted --build-dir, since it's not really necessary).

2. Run

 ./bjam --layout=system threading=single runtime-link=static link=static

and then manually copy stage/lib and the headers.

- Volodya


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