LINUX.ORG.RU

Проблема при сборке библиотеки: ключ -fPIC

 , ,


0

1

Всех приветствую!

Знает ли кто-нибудь решение такой проблемы:

собираю библиотеку (lib)xlsxio,но для нее нужна minizip-ng:

действую

cmake -S . -B build -D MZ_BUILD_TESTS=ON

~/minizip-ng$ cmake -S . -B build -D MZ_BUILD_TESTS=ON
-- Using CMake version 3.16.3
-- Using ZLIB 1.3.1
-- BZip2 library not found
-- Checking for module 'liblzma'
--   No package 'liblzma' found
-- Using LZMA 5.2.4
-- Checking for module 'libzstd'
--   No package 'libzstd' found
-- ZSTD library not found
-- Using OpenSSL 3.2.2
-- Using Iconv
-- The following features have been enabled:

 * MZ_COMPAT, Enables compatibility layer
 * MZ_ZLIB, Enables ZLIB compression
 * MZ_LZMA, Enables LZMA & XZ compression
 * MZ_PKCRYPT, Enables PKWARE traditional encryption
 * MZ_WZAES, Enables WinZIP AES encryption
 * MZ_OPENSSL, Enables OpenSSL for encryption
 * MZ_LIBBSD, Builds with libbsd crypto random
 * MZ_ICONV, Enables iconv string encoding conversion library
 * MZ_BUILD_TESTS, Builds minizip test executable

-- The following features have been disabled:

 * MZ_BZIP2, Enables BZIP2 compression
 * MZ_ZSTD, Enables ZSTD compression
 * MZ_LIBCOMP, Enables Apple compression
 * MZ_FETCH_LIBS, Enables fetching third-party libraries if not found
 * MZ_FORCE_FETCH_LIBS, Enables fetching third-party libraries always
 * MZ_COMPRESS_ONLY, Only support compression
 * MZ_DECOMPRESS_ONLY, Only support decompression
 * MZ_FILE32_API, Builds using posix 32-bit file api
 * MZ_BUILD_UNIT_TESTS, Builds minizip unit test project
 * MZ_BUILD_FUZZ_TESTS, Builds minizip fuzzer executables
 * MZ_CODE_COVERAGE, Builds with code coverage flags

-- Configuring done
-- Generating done
-- Build files have been written to: /home/bark/minizip-ng/build

Потом

cmake –build build

~/minizip-ng$ cmake --build build
make[1]: Entering directory '/home/bark/minizip-ng/build'
make[2]: Entering directory '/home/bark/minizip-ng/build'
make[2]: Leaving directory '/home/bark/minizip-ng/build'
make[2]: Entering directory '/home/bark/minizip-ng/build'
[  4%] Building C object CMakeFiles/minizip.dir/mz_crypt.c.o
[  8%] Building C object CMakeFiles/minizip.dir/mz_os.c.o
[ 13%] Building C object CMakeFiles/minizip.dir/mz_strm.c.o
[ 17%] Building C object CMakeFiles/minizip.dir/mz_strm_buf.c.o
[ 21%] Building C object CMakeFiles/minizip.dir/mz_strm_mem.c.o
[ 26%] Building C object CMakeFiles/minizip.dir/mz_strm_split.c.o
[ 30%] Building C object CMakeFiles/minizip.dir/mz_zip.c.o
[ 34%] Building C object CMakeFiles/minizip.dir/mz_zip_rw.c.o
[ 39%] Building C object CMakeFiles/minizip.dir/mz_strm_zlib.c.o
[ 43%] Building C object CMakeFiles/minizip.dir/mz_strm_lzma.c.o
[ 47%] Building C object CMakeFiles/minizip.dir/mz_crypt_openssl.c.o
[ 52%] Building C object CMakeFiles/minizip.dir/mz_os_posix.c.o
[ 56%] Building C object CMakeFiles/minizip.dir/mz_strm_os_posix.c.o
[ 60%] Building C object CMakeFiles/minizip.dir/mz_strm_pkcrypt.c.o
[ 65%] Building C object CMakeFiles/minizip.dir/mz_strm_wzaes.c.o
[ 69%] Building C object CMakeFiles/minizip.dir/compat/ioapi.c.o
[ 73%] Building C object CMakeFiles/minizip.dir/compat/unzip.c.o
[ 78%] Building C object CMakeFiles/minizip.dir/compat/zip.c.o
[ 82%] Linking C static library libminizip.a
make[2]: Leaving directory '/home/bark/minizip-ng/build'
[ 82%] Built target minizip
make[2]: Entering directory '/home/bark/minizip-ng/build'
make[2]: Leaving directory '/home/bark/minizip-ng/build'
make[2]: Entering directory '/home/bark/minizip-ng/build'
[ 86%] Building C object CMakeFiles/minizip_cli.dir/minizip.c.o
[ 91%] Linking C executable minizip
make[2]: Leaving directory '/home/bark/minizip-ng/build'
[ 91%] Built target minizip_cli
make[2]: Entering directory '/home/bark/minizip-ng/build'
make[2]: Leaving directory '/home/bark/minizip-ng/build'
make[2]: Entering directory '/home/bark/minizip-ng/build'
[ 95%] Building C object CMakeFiles/minigzip_cli.dir/minigzip.c.o
[100%] Linking C executable minigzip
make[2]: Leaving directory '/home/bark/minizip-ng/build'
[100%] Built target minigzip_cli
make[1]: Leaving directory '/home/bark/minizip-ng/build'

Потом устанавливаю в usr/local sudo make install

Теперь собираю xlsxio:


~/xlsxio$ cmake -G"Unix Makefiles"
CMake Warning:
  No source or binary directory provided.  Both will be assumed to be the
  same as the current working directory, but note that this warning will
  become a fatal error in future CMake releases.


-- XLSX I/O library version: 0.2.35
-- Configuring done
-- Generating done
-- Build files have been written to: /home/bark/xlsxio
bark@zuzu:~/xlsxio$ make
make[1]: Entering directory '/home/bark/xlsxio'
make[2]: Entering directory '/home/bark/xlsxio'
make[2]: Leaving directory '/home/bark/xlsxio'
make[2]: Entering directory '/home/bark/xlsxio'
[  4%] Building C object CMakeFiles/xlsxio_read_SHARED.dir/lib/xlsxio_read.c.o
[  8%] Building C object CMakeFiles/xlsxio_read_SHARED.dir/lib/xlsxio_read_sharedstrings.c.o
[ 13%] Linking C shared library libxlsxio_read.so
/usr/bin/ld: /usr/local/lib/libminizip.a(mz_strm.c.o): relocation R_X86_64_PC32 against symbol `mz_stream_write' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/xlsxio_read_SHARED.dir/build.make:102: libxlsxio_read.so] Error 1
make[2]: Leaving directory '/home/bark/xlsxio'
make[1]: *** [CMakeFiles/Makefile2:150: CMakeFiles/xlsxio_read_SHARED.dir/all] Error 2
make[1]: Leaving directory '/home/bark/xlsxio'
make: *** [Makefile:130: all] Error 2

Проблема тут

relocation R_X86_64_PC32 against symbol `mz_stream_write’ can not be used when making a shared object; recompile with -fPIC

Тогда ставлю в minizip-ng/CMakeLists.txt

на СЛЕДУЮЩЕЙ строке после комментария

# Set compiler options

строчку SET(CMAKE_SHARED_LIBRARY_C_FLAGS «-fpic»)

Потом, пересобираю, устанавливаю minixip-ng

Возвращаюсь к xlsxio:

результат такой же, тот же выхлоп в консоль, опять не может прилинковать

[ 13%] Linking C shared library libxlsxio_read.so

Linking C shared library libxlsxio_read.so
/usr/bin/ld: /usr/local/lib/libminizip.a(mz_strm.c.o): relocation R_X86_64_PC32 against symbol `mz_stream_write' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value

Пока не ясно в чем проблема.

Странно, что разработчики в соих инструкциях по сборке никак момент с -fPIC не упомянули.

Видимо это считается тривиальным моментом..



Последнее исправление: Gyros (всего исправлений: 1)
Ответ на: комментарий от Lrrr

Спасибо!

У меня собралось командой

~/minizip-ng$ cmake -S . -B build -D MZ_BUILD_TESTS=ON -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true
...
~/minizip-ng$ cmake --build build
...

Теперь другая проблема: две версии библ. (lib)expat:

~/xlsxio$ cmake -G"Unix Makefiles"
CMake Warning:
  No source or binary directory provided.  Both will be assumed to be the
  same as the current working directory, but note that this warning will
  become a fatal error in future CMake releases.


-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- XLSX I/O library version: 0.2.35
-- Configuring done
CMake Warning at CMakeLists.txt:181 (ADD_EXECUTABLE):
  Cannot generate a safe runtime search path for target
  example_xlsxio_read_advanced because files in some directories may conflict
  with libraries in implicit directories:

    runtime library [libexpat.so.1] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
      /usr/local/lib

  Some of these libraries may not be found correctly.


CMake Warning at CMakeLists.txt:110 (ADD_LIBRARY):
  Cannot generate a safe runtime search path for target xlsxio_read_SHARED
  because files in some directories may conflict with libraries in implicit
  directories:

    runtime library [libexpat.so.1] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
      /usr/local/lib

  Some of these libraries may not be found correctly.


CMake Warning at CMakeLists.txt:159 (ADD_EXECUTABLE):
  Cannot generate a safe runtime search path for target xlsxio_xlsx2csv
  because files in some directories may conflict with libraries in implicit
  directories:

    runtime library [libexpat.so.1] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
      /usr/local/lib

  Some of these libraries may not be found correctly.


CMake Warning at CMakeLists.txt:177 (ADD_EXECUTABLE):
  Cannot generate a safe runtime search path for target example_xlsxio_read
  because files in some directories may conflict with libraries in implicit
  directories:

    runtime library [libexpat.so.1] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
      /usr/local/lib

  Some of these libraries may not be found correctly.


-- Generating done
-- Build files have been written to: /home/bark/xlsxio

И как следствие:

~/xlsxio$ make
make[1]: Entering directory '/home/bark/xlsxio'
make[2]: Entering directory '/home/bark/xlsxio'
Scanning dependencies of target xlsxio_read_SHARED
make[2]: Leaving directory '/home/bark/xlsxio'
make[2]: Entering directory '/home/bark/xlsxio'
[  4%] Building C object CMakeFiles/xlsxio_read_SHARED.dir/lib/xlsxio_read.c.o
[  8%] Building C object CMakeFiles/xlsxio_read_SHARED.dir/lib/xlsxio_read_sharedstrings.c.o
[ 13%] Linking C shared library libxlsxio_read.so
make[2]: Leaving directory '/home/bark/xlsxio'
[ 13%] Built target xlsxio_read_SHARED
make[2]: Entering directory '/home/bark/xlsxio'
Scanning dependencies of target example_xlsxio_read_advanced
make[2]: Leaving directory '/home/bark/xlsxio'
make[2]: Entering directory '/home/bark/xlsxio'
[ 17%] Building C object CMakeFiles/example_xlsxio_read_advanced.dir/examples/example_xlsxio_read_advanced.c.o
[ 21%] Linking C executable example_xlsxio_read_advanced
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_DecryptFinal_ex'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_MAC_free'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `OSSL_PARAM_construct_end'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `lzma_stream_decoder'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_MAC_CTX_free'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_MD_CTX_free'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_aes_128_gcm'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_DigestFinal_ex'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_sha224'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_aes_256_cbc'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_sha512'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_aes_192_cbc'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_sha1'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `RAND_bytes'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `lzma_alone_encoder'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_MAC_init'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_MAC_CTX_dup'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_DigestInit_ex'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_aes_192_gcm'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_MAC_CTX_new'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_CIPHER_CTX_free'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_EncryptUpdate'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `OPENSSL_init_crypto'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_DigestUpdate'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_aes_128_ecb'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `lzma_end'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_CIPHER_CTX_set_padding'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_aes_256_ecb'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `lzma_properties_size'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_EncryptFinal_ex'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_CIPHER_CTX_ctrl'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_MD_CTX_new'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_aes_256_gcm'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_aes_128_cbc'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_CIPHER_CTX_new'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_MAC_fetch'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_MAC_update'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `lzma_alone_decoder'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `lzma_lzma_preset'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_sha384'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `lzma_stream_encoder'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `ERR_get_error'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `lzma_code'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `OSSL_PARAM_construct_utf8_string'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_DecryptUpdate'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_aes_192_ecb'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_CipherInit_ex'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_sha256'
/usr/bin/ld: libxlsxio_read.so: undefined reference to `EVP_MAC_final'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/example_xlsxio_read_advanced.dir/build.make:88: example_xlsxio_read_advanced] Error 1
make[2]: Leaving directory '/home/bark/xlsxio'
make[1]: *** [CMakeFiles/Makefile2:96: CMakeFiles/example_xlsxio_read_advanced.dir/all] Error 2
make[1]: Leaving directory '/home/bark/xlsxio'

Gyros
() автор топика
Ответ на: комментарий от Gyros

Пришлось открыть CMakeList.txt и прописывать библиотеку -lcrypto в трех местах

SET_TARGET_PROPERTIES(xlsxio_read_${LINKTYPE} PROPERTIES LINK_FLAGS "-lcrypto -Wl,--output-def=libxlsxio_read.def")

Тогда все собралось без ошибок.

Ну почему же разрабы не написали об этом всем в своих README.md!!! Что приходится влазить в их CMakeList-ы

PS Наверное можно было и -llzma прописать туда же рядом.

Однако и так все собралось.

Ура! Теперь я могу открывать Excel-вские файлы на Linux-е.

Но свои файлы я компилирую так:

gcc -std=c11 -pthread  utils.c arrstr.c nxreadcol.c   -o nxreadcol -L/usr/local/lib -Wl,-R/usr/local/lib -lpthread  -lxlsxio_read -lcrypto -llzma

Теперь получается, что мой исполняемый файл зависит от библиотек

-lxlsxio_read -lcrypto -llzma

которые он ищет в /usr/local/lib при запуске

А как сделать, чтобы они были зашиты в нем (исполняемом файле)?

-Wl,-Bstatic использовать?

А что скажете насчет такой записи

Use -l: instead of -l. For example -l:libXYZ.a to link with libXYZ.a.
Gyros
() автор топика
Последнее исправление: Gyros (всего исправлений: 3)
Ответ на: комментарий от Gyros

Вот смотри, ты вместо использования готовой библиотеки поимел трудности со сборкой и имеешь конфликт версий библиотек. Оно тебе надо? Установи libzip-dev, запусти cmake с дополнительной опцией -DWITH_LIBZIP:BOOL=ON и будет тебе счастье.

anonymous
()
Ответ на: комментарий от anonymous

А вы сами то собирали xlsxio?

Я уже собрал.

Или вы предлагаете пересобрать вашим способом?, чтобы избавиться от зависимостей

-lcrypto -llzma

У меня уже др. вопросы.

См. выше

Gyros
() автор топика
Последнее исправление: Gyros (всего исправлений: 2)

Никогда не делай make install – засрёшь систему. Если нужно что-то самосборное установить, делай пакет, хотя бы при помощи checkinstall.

Разберись чем отличается статическая библиотека от динамической.

Не добавляй ключи компиляции или сборки, смысла которых не понимаешь. Это я про -Wl,-Bstatic.

anonymous
()