Eu quero usar o Meson para construir um novo projeto c++. A primeira coisa de que preciso é uma dependência para a biblioteca Boost. Mas, embora as bibliotecas do Boost estejam instaladas no meu sistema Arch (cabeçalhos e bibliotecas), o Meson reclama que não as encontra.
Aqui está o arquivo de compilação meson:
project('myproj', 'cpp')
boost_dep = dependency('boost')
executable('myproj', 'main.cpp', dependencies : boost_dep)
O main.cpp
arquivo de origem:
int main()
{
return 0;
}
Uma lista parcial de alguns arquivos do Boost instalados no meu sistema:
$ ls /usr/lib/libboost*|head -n5; ls /usr/include/boost/*|head -n5
/usr/lib/libboost_atomic.a
/usr/lib/libboost_atomic.so
/usr/lib/libboost_atomic.so.1.65.1
/usr/lib/libboost_chrono.a
/usr/lib/libboost_chrono.so
/usr/include/boost/aligned_storage.hpp
/usr/include/boost/align.hpp
/usr/include/boost/any.hpp
/usr/include/boost/array.hpp
/usr/include/boost/asio.hpp
Saída do ninja
comando dentro do meu projeto:
[0/1] Regenerating build files.
The Meson build system
Version: 0.43.0
Source dir: /home/io/prog/myproj/src
Build dir: /home/io/prog/myproj/builddir
Build type: native build
Project name: myproj
Native C++ compiler: c++ (gcc 7.2.0)
Build machine cpu family: x86_64
Build machine cpu: x86_64
Dependency Boost () found: NO
Meson encountered an error in file meson.build, line 2, column 0:
Dependency "boost" not found
[...]
o que estou perdendo?
O seguinte problema resolveu meu problema:
Boost não detectado no Fedora · Problema nº 2547
Substituí o arquivo de compilação meson pelo seguinte:
O problema foi corrigido com a correção da detecção de diretórios de inclusão com compilador gnu e localidade não americana e para localizar e usar dependências no meson, você deve usar
dependency()
.Para encontrar impulso em geral, você deve ter isso em seu
meson.build
:ou isso se você quiser partes específicas do boost:
Se você usar uma combinação de
cxx = meson.get_compiler('cpp')
ecxx.find_library('boost_system')
, não obterá os sinalizadores do compilador e/ou dos vinculadores.find_library()
é uma verificação primitiva do compilador e apenas testa bibliotecas compartilhadas em/usr/lib
. Cabe ao usuário garantir que os cabeçalhos estejam disponíveishas_header()
e definir manualmente o diretório de inclusão comdeclare_dependency(include_directories: '/usr/local/include/xxx
)`.dependency()
é a melhor maneira de encontrar coisas e você só deve usarfind_library()
se o projeto não suportarpkg-config
oucmake
.