Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Build boost + ICU under Windows VC++ 2010 static linking

I tried now almost a week to build a reliable boost + ICU libraries under Windows and VC++ as STATIC libraries under x86 system (so I won't need any runtime dll's when). I mostly need boost regex with Unicode support and boost.locale.icu. Couldn't find all over the web any reliable solution (not on boost site or ICU) for doing this. Tried building with VC++, Cygwin + VC++ but no success so far. Any help from experience? Or, the worse scenario, any pre-build ICU static + boost static packages?

After I built ICU static, configured under Cygwin:

bash runConfigureICU  --enable-debug --disable-release Cygwin/MSVC --prefix=/cygdrive/c/icu/dist --enable-static --disable-shared

got the following static libraries:

02/17/2014  12:57 AM        23,505,784 sicudt.lib
02/17/2014  12:56 AM         7,922,572 sicuin.lib
02/17/2014  12:56 AM           101,218 sicuio.lib
02/17/2014  12:56 AM         1,507,686 sicule.lib
02/17/2014  12:56 AM           157,632 siculx.lib
02/17/2014  12:56 AM           190,472 sicutest.lib
02/17/2014  12:56 AM         1,749,872 sicutu.lib
02/17/2014  12:56 AM         4,584,154 sicuuc.lib

I built boost as static against ICU libraries:

bjam --toolset=msvc-10.0 --build-dir="C:\local\build" address-model=32 threading=multi link=static runtime-link=static -sHAVE_ICU=1 -sICU_PATH="C:\icu" -sICU_LINK="/LIBPATH:C:\icu\lib sicuuc.lib sicuin.lib sicudt.lib"

then, when trying a simple code I get unresolved symbols, so something is wrong with my compiled libs:

cl.exe /MT /EHsc /O2 /I C:\local
\boost_1_55_0 uniregboost.cpp /I C:\icu\include /link /SUBSYSTEM:CONSOLE advapi3
2.lib sicuuc.lib sicuin.lib sicudt.lib /libpath:"C:\local\boost_1_55_0\stage\lib
" /libpath:"C:\icu\lib"
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

uniregboost.cpp
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:uniregboost.exe
/SUBSYSTEM:CONSOLE
advapi32.lib
sicuuc.lib
sicuin.lib
sicudt.lib
/libpath:C:\local\boost_1_55_0\stage\lib
/libpath:C:\icu\lib
uniregboost.obj
MSVCRT.lib(MSVCR100.dll) : error LNK2005: _memmove already defined in LIBCMT.lib
(memmove.obj)
MSVCRT.lib(MSVCR100.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(
malloc.obj)
MSVCRT.lib(MSVCR100.dll) : error LNK2005: _realloc already defined in LIBCMT.lib
(realloc.obj)
MSVCRT.lib(MSVCR100.dll) : error LNK2005: _free already defined in LIBCMT.lib(fr
ee.obj)
MSVCRT.lib(MSVCR100.dll) : error LNK2005: _wcslen already defined in LIBCMT.lib(
wcslen.obj)
MSVCRT.lib(MSVCR100.dll) : error LNK2005: _strtoul already defined in LIBCMT.lib
(strtol.obj)
MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_in
fo(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBC
MT.lib(typinfo.obj)
MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall
type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) a
lready defined in LIBCMT.lib(typinfo.obj)
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; us
e /NODEFAULTLIB:library
uniregboost.obj : error LNK2019: unresolved external symbol "private: class boos
t::basic_regex<int,class boost::icu_regex_traits> & __thiscall boost::basic_rege
x<int,class boost::icu_regex_traits>::do_assign(int const *,int const *,unsigned
 int)" (?do_assign@?$basic_regex@HVicu_regex_traits@boost@@@boost@@AAEAAV12@PBH0
I@Z) referenced in function "public: class boost::basic_regex<int,class boost::i
cu_regex_traits> & __thiscall boost::basic_regex<int,class boost::icu_regex_trai
ts>::assign(int const *,int const *,unsigned int)" (?assign@?$basic_regex@HVicu_
regex_traits@boost@@@boost@@QAEAAV12@PBH0I@Z)
uniregboost.obj : error LNK2019: unresolved external symbol "public: class std::
vector<int,class std::allocator<int> > __thiscall boost::re_detail::icu_regex_tr
aits_implementation::do_transform(int const *,int const *,class icu_52::Collator
 const *)const " (?do_transform@icu_regex_traits_implementation@re_detail@boost@
@QBE?AV?$vector@HV?$allocator@H@std@@@std@@PBH0PBVCollator@icu_52@@@Z) reference
d in function "public: class std::vector<int,class std::allocator<int> > __thisc
all boost::re_detail::icu_regex_traits_implementation::transform(int const *,int
 const *)const " (?transform@icu_regex_traits_implementation@re_detail@boost@@QB
E?AV?$vector@HV?$allocator@H@std@@@std@@PBH0@Z)
uniregboost.obj : error LNK2019: unresolved external symbol "public: bool __this
call boost::icu_regex_traits::isctype(int,unsigned __int64)const " (?isctype@icu
_regex_traits@boost@@QBE_NH_K@Z) referenced in function "private: bool __thiscal
l boost::re_detail::perl_matcher<class boost::u8_to_u32_iterator<class std::_Str
ing_const_iterator<char,struct std::char_traits<char>,class std::allocator<char>
 >,int>,class std::allocator<struct boost::sub_match<class boost::u8_to_u32_iter
ator<class std::_String_const_iterator<char,struct std::char_traits<char>,class
std::allocator<char> >,int> > >,class boost::icu_regex_traits>::match_word_bound
ary(void)" (?match_word_boundary@?$perl_matcher@V?$u8_to_u32_iterator@V?$_String
_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@boost@@V?$alloca
tor@U?$sub_match@V?$u8_to_u32_iterator@V?$_String_const_iterator@DU?$char_traits
@D@std@@V?$allocator@D@2@@std@@H@boost@@@boost@@@std@@Vicu_regex_traits@2@@re_de
tail@boost@@AAE_NXZ)
uniregboost.exe : fatal error LNK1120: 3 unresolved externals

I didn't forget to add the static flag for ICU in my code:

#define U_STATIC_IMPLEMENTATION

UPDATE:

rebuilt all ICU and Boost static, now I have only one error linking:

cl.exe /MT /EHsc /O2 /I C:\lib\b
oost-1.55.0-vs2010\include\boost-1_55 uniregboost.cpp /I C:\lib\icu-52.1-vs2010\
include /link /SUBSYSTEM:CONSOLE advapi32.lib sicuuc.lib sicuin.lib sicudt.lib s
icuuc.lib /libpath:"C:\lib\boost-1.55.0-vs2010\lib" /libpath:"C:\lib\icu-52.1-vs
2010\lib"
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

uniregboost.cpp
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:uniregboost.exe
/SUBSYSTEM:CONSOLE
advapi32.lib
sicuuc.lib
sicuin.lib
sicudt.lib
sicuuc.lib
/libpath:C:\lib\boost-1.55.0-vs2010\lib
/libpath:C:\lib\icu-52.1-vs2010\lib
uniregboost.obj
   Creating library uniregboost.lib and object uniregboost.exp
libboost_regex-vc100-mt-s-1_55.lib(icu.obj) : warning LNK4217: locally defined s
ymbol ??0Locale@icu_52@@QAE@ABV01@@Z (public: __thiscall icu_52::Locale::Locale(
class icu_52::Locale const &)) imported in function "public: class icu_52::Local
e __thiscall boost::re_detail::icu_regex_traits_implementation::getloc(void)cons
t " (?getloc@icu_regex_traits_implementation@re_detail@boost@@QBE?AVLocale@icu_5
2@@XZ)
libboost_regex-vc100-mt-s-1_55.lib(icu.obj) : warning LNK4217: locally defined s
ymbol ??0Locale@icu_52@@QAE@XZ (public: __thiscall icu_52::Locale::Locale(void))
 imported in function "public: class icu_52::Locale __thiscall boost::icu_regex_
traits::getloc(void)const " (?getloc@icu_regex_traits@boost@@QBE?AVLocale@icu_52
@@XZ)
libboost_regex-vc100-mt-s-1_55.lib(icu.obj) : warning LNK4217: locally defined s
ymbol ??1Locale@icu_52@@UAE@XZ (public: virtual __thiscall icu_52::Locale::~Loca
le(void)) imported in function "public: __thiscall boost::re_detail::icu_regex_t
raits_implementation::~icu_regex_traits_implementation(void)" (??1icu_regex_trai
ts_implementation@re_detail@boost@@QAE@XZ)
libboost_regex-vc100-mt-s-1_55.lib(icu.obj) : error LNK2019: unresolved external
 symbol "__declspec(dllimport) public: static class icu_52::Collator * __cdecl i
cu_52::Collator::createInstance(class icu_52::Locale const &,enum UErrorCode &)"
 (__imp_?createInstance@Collator@icu_52@@SAPAV12@ABVLocale@2@AAW4UErrorCode@@@Z)
 referenced in function "public: __thiscall boost::re_detail::icu_regex_traits_i
mplementation::icu_regex_traits_implementation(class icu_52::Locale const &)" (?
?0icu_regex_traits_implementation@re_detail@boost@@QAE@ABVLocale@icu_52@@@Z)
uniregboost.exe : fatal error LNK1120: 1 unresolved externals
like image 880
bsteo Avatar asked Feb 17 '14 12:02

bsteo


1 Answers

I'm not allowed to comment yet, so I'm giving my comment as an answer (sorry for the inconvenience), for I'm struggling with exactly the same issue. I detected following test file:

<boost>\libs\locale\build\has_icu_test.cpp

with these lines of code:

#if defined(_MSC_VER) && !defined(_DLL)
#error "Mixing ICU with a static runtime doesn't work"
#endif

Maybe (at least on Windows) a static boost with ICU compilation is not possible?

like image 81
Rainer Avatar answered Oct 15 '22 20:10

Rainer