Как создать Boost со stati c ICU через MinGW на Linux для Windows - PullRequest
0 голосов
/ 02 февраля 2020

Я хочу собрать библиотеки C ++ Boost с MinGW для Windows в Docker Linux образе. Для libz, bz2, xz, zstd и ICU это уже работает и соответствующие файлы установлены. Все статически связано.

Структура файловой системы выглядит следующим образом:

$ ls -l /mingw/
drwxr-xr-x 1 root root 4096 Feb  2 00:09 include
drwxr-xr-x 1 root root 4096 Feb  2 00:09 lib
drwxr-xr-x 5 root root 4096 Feb  2 00:09 share
$ ls -l /mingw/lib/
drwxr-xr-x 3 root root     4096 Feb  2 00:09 icu
-rw-r--r-- 1 root root   371114 Feb  1 19:58 libbz2.a
-rw-r--r-- 1 root root  1940512 Feb  2 00:03 liblzma.a
-rwxr-xr-x 1 root root      876 Feb  2 00:03 liblzma.la
-rwxr-xr-x 1 root root      736 Feb  2 00:09 libsicudt.a
-rwxr-xr-x 1 root root 10895028 Feb  2 00:09 libsicuin.a
-rwxr-xr-x 1 root root   143990 Feb  2 00:09 libsicuio.a
-rwxr-xr-x 1 root root  5196448 Feb  2 00:09 libsicuuc.a
-rw-r--r-- 1 root root   118758 Feb  1 18:15 libz.a
-rw-r--r-- 1 root root   850738 Feb  1 21:11 libzstd.a
drwxr-xr-x 1 root root     4096 Feb  2 00:09 pkgconfig
$ ls -l /mingw/include/
-rw-r--r-- 1 root root   6240 Feb  1 19:58 bzlib.h
-rw-r--r-- 1 root root   4569 Nov  4 17:54 cover.h
drwxr-xr-x 2 root root   4096 Feb  2 00:03 lzma
-rw-r--r-- 1 root root   9817 Feb  2 00:03 lzma.h
drwxr-xr-x 2 root root   4096 Feb  2 00:09 unicode
-rw-r--r-- 1 root root  11500 Nov  4 17:54 zbuff.h
-rw-rw-r-- 1 root root  16298 Jan 15  2017 zconf.h
-rw-r--r-- 1 root root  17203 Nov  4 17:54 zdict.h
-rw-rw-r-- 1 root root  96239 Jan 15  2017 zlib.h
-rw-r--r-- 1 root root 119972 Nov  4 17:54 zstd.h
-rw-r--r-- 1 root root   3751 Nov  4 17:54 zstd_errors.h

Я также создал файл site-config.jam, благодаря которому b2 находит libz, bz2 , xz и zstd.

$ more /etc/site-config.jam 
using gcc : : x86_64-w64-mingw32-g++ : 
    <cxxflags>-DBOOST_ASIO_HAS_STD_STRING_VIEW
    <cxxflags>-DBOOST_ASIO_HAS_STD_IOSTREAM_MOVE
    <cxxflags>--sysroot=/mingw
    <cxxflags>-std=c++17 ;
using zlib : : <include>/mingw/include <search>/mingw/lib ;
using bzip2 : : <include>/mingw/include <search>/mingw/lib ;
using lzma : : <include>/mingw/include <search>/mingw/lib ;
using zstd : : <include>/mingw/include <search>/mingw/lib ;

К сожалению, это невозможно для ICU. Использование -sICU_PATH также не сработало.

Моя текущая командная строка для сборки:

$ cd /mnt/boost_1_72_0
$ ./b2 toolset=gcc variant=release threading=multi link=static \
  target-os=windows architecture=x86 address-model=64 abi=ms binary-format=pe \
  -sICU_PATH=/mingw/lib \
  --layout=system --prefix=/install \
  --without-python --without-graph_parallel --without-mpi \
  -j $(nproc) install

Это печатает:

Performing configuration checks

    - default address-model    : 64-bit
    - default architecture     : x86
    - C++11 mutex              : yes
[...]
    - has_icu builds           : no
    - zlib                     : yes
    - bzip2                    : yes
    - lzma                     : yes
    - zstd                     : yes
    - lzma                     : yes
    - has_lzma_cputhreads builds : yes
    - iconv (libc)             : no
    - iconv (separate)         : no
    - icu                      : no
    - icu (lib64)              : no
    - native-atomic-int32-supported : yes
    - message-compiler         : no
    - native-syslog-supported  : no
    - pthread-supports-robust-mutexes : no
    - compiler-supports-ssse3  : yes
    - compiler-supports-avx2   : yes
    - gcc visibility           : yes
    - long double support      : yes
    - libbacktrace builds      : no
    - addr2line builds         : no
    - WinDbg builds            : no
    - WinDbgCached builds      : no
    - BOOST_COMP_GNUC >= 4.3.0 : yes
[...]

Вы можете запустить и воспроизвести это по моему тесту Docker image:

$ docker run -it --rm bebuch/boost-with-static-icu-prepared:latest

Что мне нужно изменить, чтобы icu переключился на yes при b2 запуске?

Редактировать 2020-02-03: Часть ответа - ошибка, исправленная в Boost 1.73.0:

1 Ответ

0 голосов
/ 03 февраля 2020

Основная проблема - две ошибки в конфигурации сборки Boost.Regex 1.72.0.

После их исправления / обхода сборка завершается успешно:

./b2 toolset=gcc variant=release threading=multi link=static \
  target-os=windows architecture=x86 address-model=64 abi=ms binary-format=pe \
  include=/mingw/include library-path=/mingw/lib \
  define=U_DISABLE_VERSION_SUFFIX=1 \
  --layout=system --prefix=/install \
  --without-python --without-graph_parallel --without-mpi \
  -j $(nproc) install

include и library-path необходимы для поиска файлов заголовков и библиотек. Это также делает последние 4 строки файла site-config.jam устаревшими.

U_DISABLE_VERSION_SUFFIX=1 требуется, потому что моя сборка ICU не использует эту функцию. Без него вы можете получить ошибку компоновщика, такую ​​как undefined reference to ucol_open_65 / ucol_close_65. В моей библиотеке ICU stati c функции просто названы ucol_open / ucol_close.

...