bin / ld: não é possível localizar a instalação -lnameOfTheLibrary BigARTM - CentOS v7

4

Estou tentando instalar o BigARTM de acordo com este tutorial no Centos 7. Mas estou recebendo este erro:

/bin/ld: cannot find -lboost_thread-mt
/bin/ld: cannot find -lboost_program_options-mt
/bin/ld: cannot find -lboost_date_time-mt
/bin/ld: cannot find -lboost_filesystem-mt
/bin/ld: cannot find -lboost_iostreams-mt
/bin/ld: cannot find -lboost_system-mt
/bin/ld: cannot find -lboost_chrono-mt
/bin/ld: cannot find -lboost_timer-mt
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libpthread.a(libpthread.o): In function 'sem_open':
(.text+0x6823): warning: the use of 'mktemp' is dangerous, better use 'mkstemp'
collect2: error: ld returned 1 exit status
make[2]: [bin/bigartm] Error 1
make[1]:  [src/bigartm/CMakeFiles/bigartm.dir/all] Error 2
make:  [all] Error 2

Eu instalei o 'Development Tools' usando yum e encontrei as bibliotecas em /usr/lib64

rpm -ql boost-devel | grep '_program-\|_date_time-\|_thread-\|_filesystem-\|_iostreams-\|_system-\|_chrono-\|_timer-' 
/usr/lib64/libboost_chrono-mt.so
/usr/lib64/libboost_date_time-mt.so
/usr/lib64/libboost_filesystem-mt.so
/usr/lib64/libboost_iostreams-mt.so
/usr/lib64/libboost_system-mt.so
/usr/lib64/libboost_thread-mt.so
/usr/lib64/libboost_timer-mt.so

Eu também instalei o boost-devel sudo yum install boost-devel

Para libboost_thread lib, executei os seguintes comandos:

[oshri@analytics build]$ rpm -ql boost-devel | grep  libboost_thread
/usr/lib64/libboost_thread-mt.so
/usr/lib64/libboost_thread.a
/usr/lib64/libboost_thread.so
[oshri@analytics build]$  locate thread | grep libboost_thread
/home/oshri/PycharmProjects/playground/libboost_thread-mt.so
/usr/lib/libboost_thread-mt.so
/usr/lib/libboost_thread.a
/usr/lib/libboost_thread.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libboost_thread-mt.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libboost_thread.a
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libboost_thread.so
/usr/lib64/libboost_thread-mt.so
/usr/lib64/libboost_thread-mt.so.1.53.0
/usr/lib64/libboost_thread.a
/usr/lib64/libboost_thread.so
/usr/lib64/libboost_thread.so.1.59.0
/usr/lib64 (copy)/libboost_thread-mt.so.1.53.0
[oshri@analytics build]$  locate -e thread | grep libboost_thread
/usr/lib/libboost_thread.a
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libboost_thread.a
/usr/lib64/libboost_thread-mt.so
/usr/lib64/libboost_thread-mt.so.1.53.0
/usr/lib64/libboost_thread.a
/usr/lib64/libboost_thread.so
/usr/lib64/libboost_thread.so.1.59.0
/usr/lib64 (copy)/libboost_thread-mt.so.1.53.0

Eu tentei de três maneiras:

  1. Para criar um link (usando ln ) de /usr/lib64/libboost_<name>-mt.so para /usr/lib64/lboost_<name>-mt.so e para adicionar o /usr/lib64 a LD_LIBRARY_PATH .
  2. Para criar um link de /usr/lib64/libboost_<name>-mt.so para o% /usr/lib/lboost_<name>-mt.so .
  3. Para adicionar LIBS = -L /usr/lib64 ao MakeFile.

Por exemplo:

[oshri@analytics build]$ ls -l /usr/lib/\*program\*
lrwxrwxrwx 4 root root 37 Jan 19 17:38 /usr/lib/lboost_program_options-mt -> libboost_program_options-mt.so.1.53.0
lrwxrwxrwx 4 root root 37 Jan 19 17:38 /usr/lib/lboost_program_options-mt.so -> libboost_program_options-mt.so.1.53.0
[oshri@analytics build]$ ls -l /usr/lib64/\*program\*
lrwxrwxrwx 4 root root     37 Jan 19 17:38 /usr/lib64/lboost_program_options-mt.so -> libboost_program_options-mt.so.1.53.0
lrwxrwxrwx 4 root root     37 Jan 19 17:38 /usr/lib64/libboost_program_options-mt.so -> libboost_program_options-mt.so.1.53.0
-rwxr-xr-x 1 root root 468952 Nov  5 20:58 /usr/lib64/libboost_program_options-mt.so.1.53.0
lrwxrwxrwx 1 root root     34 Jan 19 17:38 /usr/lib64/libboost_program_options.so -> libboost_program_options.so.1.53.0
-rwxr-xr-x 1 root root 468944 Nov  5 20:58 /usr/lib64/libboost_program_options.so.1.53.0
[oshri@analytics build]$ printenv LD_LIBRARY_PATH
/home/oshri/PycharmProjects/EuroSalesOptimization/runtime/:/usr/lib64/
    
por oshribr 24.01.2017 / 17:07

1 resposta

1

Em uma virtualização Centos7 de 64 bits sem modificações especiais (os diretórios lib versus lib64 têm sido problemáticos quando construímos o Linux no passado, por isso menciono o arco):

# yum -y install git make cmake '@Development Tools' boost-devel
# git clone --branch=stable https://github.com/bigartm/bigartm.git
# cd bigartm
# mkdir build && cd build
# cmake ..
# make
... jeopardy music ...

Ok, é preciso até 99% através do build para falhar. Com uma construção detalhada, podemos descobrir o comando preciso (com algumas alimentações de linha adicionadas manualmente para evitar a insanidade na rolagem horizontal):

# make VERBOSE=1
...
/usr/bin/c++    -Wall -pthread -fPIC -std=c++11 -O3 -DNDEBUG  
  -static CMakeFiles/bigartm.dir/srcmain.cc.o
  CMakeFiles/bigartm.dir/__/artm/cpp_interface.cc.o  -o ../../bin/bigartm
  -rdynamic ../../lib/libmessages_proto.a ../../lib/libartm-static.a
  ../../lib/libprotobuf.a ../../lib/libgoogle-glog.a -lboost_thread-mt
  -lboost_program_options-mt -lboost_date_time-mt -lboost_filesystem-mt
  -lboost_iostreams-mt -lboost_system-mt -lboost_chrono-mt -lboost_timer-mt
  ../../lib/libmessages_proto.a ../../lib/libinternals_proto.a ../../lib/libgflags.a
  -lpthread 
/usr/bin/ld: cannot find -lboost_thread-mt
/usr/bin/ld: cannot find -lboost_program_options-mt
/usr/bin/ld: cannot find -lboost_date_time-mt
/usr/bin/ld: cannot find -lboost_filesystem-mt
/usr/bin/ld: cannot find -lboost_iostreams-mt
/usr/bin/ld: cannot find -lboost_system-mt
/usr/bin/ld: cannot find -lboost_chrono-mt
/usr/bin/ld: cannot find -lboost_timer-mt
/usr/bin/ld: cannot find -lpthread
/usr/bin/ld: cannot find -lstdc++
/usr/bin/ld: cannot find -lm
/usr/bin/ld: cannot find -lpthread
/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
make[2]: *** [bin/bigartm] Error 1

Não encontrando a biblioteca C, bem, agora isso é problemático. Uma próxima pergunta relevante é quais arquivos precisos foram ld procurando por algo que não foi encontrado, facilmente solucionado com sysdig :

# sysdig -p '%fd.name' proc.name contains ld

E em outros lugares, execute make e lo! os arquivos estáticos de *.a estão sendo procurados de acordo com sysdig (o que, como ld já nos disse, não existe). Portanto, há pelo menos duas soluções possíveis aqui, por um lado, para não compilar a estática, ou a outra, para obter todas as várias bibliotecas estáticas instaladas. Vamos com a opção não-estática, com a ajuda do BUILD_STATIC_LIBS flag no arquivo CMakeLists.txt .

# cd .. && rm -rf build
# mkdir build && cd build
# cmake -D BUILD_STATIC_LIBS=OFF ..

Bem, isso não ajudou. Ok, vamos editar manualmente o arquivo CMakeLists.txt e desativar STATIC builds ...

# cd .. && rm -rf build
# vi CMakeLists.txt
...
... make stuff again ...
[ 91%] Built target artm-static
Linking CXX shared library ../../lib/libartm.so
/usr/bin/ld: cannot find -lgflags-static
collect2: error: ld returned 1 exit status

Opa, parece que este projeto realmente quer realmente suas bibliotecas estáticas. Alguns

yum whatprovides '*libboost_thread-mt.a'
yum whatprovides '*libc.a'
...
yum -y install glibc-static boost-static

churn mais tarde e depois

cd ..
git checkout CMakeLists.txt
... build again ...
...
SystemError: Cannot compile 'Python.h'. Perhaps you need to install python-dev|python-devel.

É bom saber, depois de todo esse outro trabalho ...

# yum -y install git make cmake '@Development Tools' boost-devel glibc-static \
  boost-static python-devel
# git clone --branch=stable https://github.com/bigartm/bigartm.git
# cd bigartm
# mkdir build && cd build
# cmake ..
# make

Esse tipo de coisa deve ser movido para um arquivo RPM, então todas essas dependências podem ser listadas, ao invés de exigir que as pessoas se mexam com clones git e documentos mais ou menos ...

    
por 24.01.2017 / 23:00