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 ...