Как я могу статически связать Arrow при сборке parquet-cpp?

От главная страница parquet-cpp:

По умолчанию Parquet ссылается на общие библиотеки Arrow. Если вы хотите статически связать символы стрелки вместо этого, передайте -DPARQUET_ARROW_LINKAGE = static.

Я хочу статически связать Arrow, потому что я хочу использовать свою программу на других серверах, на которых не будет установлен Arrow. Я старался -DPARQUET_ARROW_LINKAGE=static, но я получаю ошибку об «отсутствующих транзитивных зависимостях»:

# cmake -DPARQUET_BUILD_TESTS=Off -DCMAKE_BUILD_TYPE=Release -DPARQUET_MINIMAL_DEPENDENCY=ON -DPARQUET_ARROW_LINKAGE=static .
-- The C compiler identification is GNU 4.8.5
...
-- [ /usr/local/share/cmake-3.9/Modules/FindBoost.cmake:1717 ] Boost_FOUND = 1
-- Boost version: 1.55.0
...
-- THRIFT_HOME:
-- Thrift compiler/libraries NOT found:  (THRIFT_INCLUDE_DIR-NOTFOUND, THRIFT_STATIC_LIB-NOTFOUND). Looked in system search paths.
-- Thrift include dir: /root/tmp/parquet-cpp-master/thrift_ep/src/thrift_ep-install/include
-- Thrift static library: /root/tmp/parquet-cpp-master/thrift_ep/src/thrift_ep-install/lib/libthrift.a
-- Thrift compiler: /root/tmp/parquet-cpp-master/thrift_ep/src/thrift_ep-install/bin/thrift
-- Checking for module 'arrow'
--   No package 'arrow' found
-- Could not find the Arrow library. Looked for headers in , and for libs in
-- Building Apache Arrow from commit: 501d60e918bd4d10c429ab34e0b8e8a87dffb732
-- CMAKE_CXX_FLAGS:  -O3 -DNDEBUG  -Wall -std=c++11
-- Found cpplint executable at /root/tmp/parquet-cpp-master/build-support/cpplint.py
CMake Error at CMakeLists.txt:515 (message):
Missing transitive dependencies for Arrow static linking

Так что я нашел код это генерирует ошибку:

  if (NOT DEFINED ENV{BROTLI_STATIC_LIB_ENC} OR
NOT DEFINED ENV{BROTLI_STATIC_LIB_DEC} OR
NOT DEFINED ENV{BROTLI_STATIC_LIB_COMMON} OR
NOT DEFINED ENV{SNAPPY_STATIC_LIB} OR
NOT DEFINED ENV{ZLIB_STATIC_LIB} OR
NOT DEFINED ENV{LZ4_STATIC_LIB} OR
NOT DEFINED ENV{ZSTD_STATIC_LIB})
message(FATAL_ERROR "Missing transitive dependencies for Arrow static linking")

Но это не очень помогает мне, так как я не знаю, что делать, чтобы определить эти переменные среды.

Нужно ли мне сначала скомпилировать Arrow и установить себя? (Я бы предпочел, чтобы parquet-cpp сделал это для меня.)

2

Решение

Я подготовил скрипт для загрузки источников зависимостей, установки переменных среды и запуска cmake линия в конце. Просто измените значение переменной DEPDIR, установив его в каталог по выбору.

#!/bin/bash

CMKDIR=$PWD
DEPDIR=/tmp

cd $DEPDIR

#snappy
git clone https://github.com/google/snappy.git
cd snappy
mkdir build
cd build
cmake ..
make

export SNAPPY_STATIC_LIB=$DEPDIR/snappy/build/libsnappy.a

cd $DEPDIR

#brotli
git clone https://github.com/google/brotli.git
cd brotli
mkdir out
cd out
../configure-cmake
make

export BROTLI_STATIC_LIB_ENC=$DEPDIR/brotli/out/libbrotlienc-static.a
export BROTLI_STATIC_LIB_DEC=$DEPDIR/brotli/out/libbrotlidec-static.a
export BROTLI_STATIC_LIB_COMMON=$DEPDIR/brotli/out/libbrotlicommon-static.a

cd $DEPDIR

#zlib
git clone https://github.com/madler/zlib.git
cd zlib
./configure
make

export ZLIB_STATIC_LIB=$DEPDIR/zlib/libz.a

cd $DEPDIR

#lz4
git clone https://github.com/lz4/lz4.git
cd lz4
make

export LZ4_STATIC_LIB=$DEPDIR/lz4/lib/liblz4.a

cd $DEPDIR

#zstd
git clone https://github.com/facebook/zstd.git
cd zstd
make

export ZSTD_STATIC_LIB=$DEPDIR/zstd/lib/libzstd.a

cd $CMKDIR

cmake -DPARQUET_BUILD_TESTS=Off -DCMAKE_BUILD_TYPE=Release -DPARQUET_MINIMAL_DEPENDENCY=ON -DPARQUET_ARROW_LINKAGE=static

Этот скрипт очень прост, но должен быть эффективным. Просто скопируйте его в новый файл (в том же каталоге CMakeLists.txt), дайте файлу права на выполнение (т.е. sudo chmod +x filename) и выполните это так:

./filename.sh

О вопрос о fPIC, Вы должны отредактировать несколько файлов:

быстро: добавить эту строку в CMakeLists.txt, в начале, после первых двух строк:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

LZ4 а также zstd: отредактируйте Makefile в подкаталоге lib, после этой строки

CFLAGS  += $(DEBUGFLAGS) $(MOREFLAGS)

добавьте эту строку:

CFLAGS += -fPIC

Zlib: отредактируйте Makefile после этой строки

CFLAGS=-O3 -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN

добавьте эту строку:

CFLAGS += -fPIC

brotli: насколько я вижу из make output, опция уже установлена.

Перед повторным запуском make выполните этот скрипт:

#!/bin/bash

DEPDIR=/tmp

cd $DEPDIR/snappy/build
cmake ..
make clean
make

cd $DEPDIR/lz4
make clean
make

cd $DEPDIR/zstd
make clean
make
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]