
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