Boost logo

Boost :

Subject: Re: [boost] building a run-time static version
From: Lorenzo Bettini (bettini_at_[hidden])
Date: 2009-08-20 12:49:22

Vladimir Prus wrote:
> Lorenzo Bettini wrote:
>> still problems (please read below)
>> If I do (thus, using the .a file directly)
>> g++ regex_use.o $HOME/boost/lib/libboost_regex.a -o regex_use_static
>> I don't get errors, but the binary still uses dynamic libraries:
>> ldd regex_use_static
>> => (0xb800e000)
>> => /usr/lib/ (0xb7eff000)
>> => /lib/tls/i686/cmov/ (0xb7ed9000)
>> => /lib/ (0xb7ec9000)
>> => /lib/tls/i686/cmov/ (0xb7d66000)
>> /lib/ (0xb800f000)
> This is expected. gcc does use shared libraries by default.
>>> ./bjam --layout=system threading=single runtime-link=static link=static install
>>> (Note that I have omitted --build-dir, since it's not really necessary).
>> I did, and now get the library installed, but, again, I get:
>> /usr/lib/gcc/i486-linux-gnu/4.3.3/libstdc++.a(locale.o): In function
>> `std::locale::_Impl::_M_install_cache(std::locale::facet const*,
>> unsigned int)':
>> (.text._ZNSt6locale5_Impl16_M_install_cacheEPKNS_5facetEj+0x2a):
>> undefined reference to `pthread_mutex_lock'
> This may suggest that libstdc++ unconditionally uses threading...
>> g++ -static regex_use.o -I$HOME/boost/include -L$HOME/boost/lib
>> -lboost_regex -o regex_use_static
>> /home/bettini/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'
>> /home/bettini/boost/lib/libboost_regex.a(static_mutex.o): In function
>> `boost::scoped_static_mutex_lock::lock()':
>> ...
> ... and that causes Boost.Regex to make use of threads as well. Can you
> try removing everything again, and rebuild with the additional
> define=BOOST_DISABLE_THREADS=1 --without-thread
> options? If that does not help, it means that libstdc++ just needs threads,
> and there's no way around that.


OK, so I managed to build it :-)

this is the two command lines I've used:

./ --prefix=$HOME/boost --libdir=$HOME/boost/lib
--with-libraries=regex --without-icu

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

I can confirm that define=BOOST_DISABLE_THREADS=1 is required, because
even with threading=single the multi threading code is still built and
added to the library (and this makes the library itself to depend on
threads, and thus it cannot be used to build completely static
binaries). Is this a bug, or the intentional behavior? If so, what
does threading=single mean?

thanks again

Lorenzo Bettini, PhD in Computer Science, DI, Univ. Torino
ICQ# lbetto, 16080134     (GNU/Linux User # 158233)

Boost list run by bdawes at, gregod at, cpdaniel at, john at