Boost logo

Boost :

Subject: [boost] compiling Boost boost_1_45_0 regex with icu (redhat). A problem and its fix.
From: Candid Shot (candid_shot_1_at_[hidden])
Date: 2011-01-04 09:05:10


(I am listing a problem in compling boost/regex, and a solution, and want to
know if this is the right approach. We are trying to use boost as a static
library, with regex and icu support. Thanks. =cs)

Here used is the vanilla static compile of ICU (i.e. no changes to
icu4c-4_6-src.tgz), installed in subdirectory icu2 as:

./bootstrap.sh --with-icu=/home/cxs/icu2 --prefix=osboost
--without-libraries=python link=static variant=release

====================================================================

$ ./bjam --list-libraries -d+2

....
....
gcc.compile.c++ bin.v2/libs/regex/build/gcc-4.1.2/debug/has_icu_test.o

    "g++" -ftemplate-depth-128 -O0 -fno-inline -Wall -pedantic -g -fPIC
-DBOOST_ALL_NO_LIB=1 -DBOOST_HAS_ICU=1 -I"." -I"/home/cxs/icu2/include" -c -o
"bin.v2/libs/regex/build/gcc-4.1.2/debug/has_icu_test.o"
"libs/regex/build/has_icu_test.cpp"

libs/regex/build/has_icu_test.cpp:26:2: warning: no newline at end of file
libs/regex/build/has_icu_test.cpp: In function 'int main()':
libs/regex/build/has_icu_test.cpp:24: warning: unused variable 'c'

gcc.link bin.v2/libs/regex/build/gcc-4.1.2/debug/has_icu

    "g++" -L"/home/cxs/icu2/lib" -Wl,-R -Wl,"/home/cxs/icu2/bin" -Wl,-R
-Wl,"/home/cxs/icu2/lib" -Wl,-rpath-link -Wl,"/home/cxs/icu2/lib" -o
"bin.v2/libs/regex/build/gcc-4.1.2/debug/has_icu" -Wl,--start-group
"bin.v2/libs/regex/build/gcc-4.1.2/debug/has_icu_test.o" -Wl,-Bstatic
-Wl,-Bdynamic -licuuc -licui18n -licudata -Wl,--end-group -g

/home/cxs/icu2/lib/libicuuc.a(putil.ao): In function `uprv_dl_sym_46':
putil.c:(.text+0x241): undefined reference to `dlsym'
/home/cxs/icu2/lib/libicuuc.a(putil.ao): In function `uprv_dl_open_46':
putil.c:(.text+0x2a6): undefined reference to `dlopen'
/home/cxs/icu2/lib/libicuuc.a(putil.ao): In function `uprv_dl_close_46':
putil.c:(.text+0x269): undefined reference to `dlclose'
collect2: ld returned 1 exit status
...failed updating 1 target...
Performing configuration checks

    - has_icu builds : no
....
....

(So icu is not detected due to a missing -ldl flag in the last call to g++
above.)
====================================================================

This issue is taken care of by adding to libs/regex/build/Jamfile.v2 these lines

to the else clause of

if $(ICU_LINK) {...}
else {

      lib dl : : <search>$(ICU_PATH)/lib <link>shared <runtime-link>shared ;
      lib dl : : <toolset>msvc <variant>debug <name>dl <search>$(ICU_PATH)/lib
<link>shared <runtime-link>shared ;
      lib dl : : <name>this_is_an_invalid_library_name ;
      ...
}

and add to ICU_OPTS = <library>dl/<link>shared/<runtime-link>shared

The question is: is this the correct approach? Thanks,

=cs

      


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