
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