Ponto V!

Home C/C++ Visual C++ Compilando a Boost com Visual C++ – Versão 2010
Bruno Crivelari Sanches
Compilando a Boost com Visual C++ – Versão 2010Imprimir
Escrito por Bruno Crivelari Sanches

Já tem algum tempo que escrevi o artigo sobre como compilar a Boost e configurar o Visual Studio para utiliza-la. O processo de compilação infelizmente mudou e assim foi preciso criar este novo artigo para manter o portal atualizado. Felizmente as mudanças simplificaram o processo como veremos na sequência.

Boost

A biblioteca Boost na verdade é uma vasta coleção das mais variadas bibliotecas. Desde simples macros a uma biblioteca completa para comunicação de processos. Existem novos conteineres, como já vimos no artigo de Gerenciamento de Rercursos, uma coleção completa de smart pointers, threads, tuplas, etc. Para uma lista completa do que existe disponível, recomendo uma olhada na lista que existe no próprio site: Boost Library Documentation.

Todas as bibliotecas existentes são criadas visando a maior compatibilidade possível com os atuais padrões do C++ e muitas vezes são criadas por pessoas que estão envolvidas diretamente no desenvolvimento do padrão C++. A Boost acaba inclusive servindo como “porta de entrada” para a biblioteca padrão, devido a muitas bibliotecas dela acabarem sendo incorporadas no padrão C++.

Um detalhe importante e que confude muitos que não conhecem a biblioteca é que ela não tem o objetivo de substituir qualquer biblioteca ou funcionalidade do C++, mas apenas de complementar o que já existe, assim não existem questões como: “Devo usar STL ou Boost?”. Atualmente algumas poucas bibliotecas da Boost podem entrar em conflito com o padrão C++0x, pois são bibliotecas da Boost que foram adotadas pelo comitê e agora podem ser também encontradas no namespace std, como, por exemplo, std::array e boost::array. Nesse caso, eu sugiro utilizar a versão existente no padrão C++, a não ser é claro que no seu projeto ainda não possua a disposição um compilador C++0x.

Outro fato importante é de que não é preciso conhecer toda a biblioteca para utiliza-la. Se precisa, por exemplo, apenas de uma biblioteca para manipulação de grafos, então estude e utilize apenas a biblioteca boost::graph, não é preciso conhecer todas as outras bibliotecas.

Por fim, vale lembrar que algumas bibliotecas não precisam ser compiladas para serem usadas, uma lista pode ser encontrada na documentação: Header-Only Libraries.

Instalando a Boost

O primeiro passo da instalação é realizar o download da bilioteca, que pode ser encontrada clicando-se aqui. A versão mais recente da data da escrita desse artigo é a 1.47. Caso a forma de compilação venha a mudar em alguma outra versão, irei atualizar o artigo.

Após o download, extraia os arquivos para o diretório onde você armazena bibliotecas que utiliza, no caso do meu computador, estas ficam armazenadas no caminho d:\libs\. A partir deste ponto vou assumir que a biblioteca esteja instalada no diretório d:\libs. Caso utilize outro caminho, não tem problema algum, apenas certifique-se de adaptar os passos a seguir de acordo com o caminho que usou.

Feito a extração dos arquivos, o resultado vai ser o diretório boost_1_47_0 dentro do diretório onde foi instalada a Boost, no meu caso: d:\libs\boost_1_47_0.

O próximo passo é abrir um terminal da SDK do Windows, que é necessária para compilação da biblioteca. Caso não tenha a SDK do Windows instalada, veja como fazer a instalação da mesma neste outro aritgo. Para abrir o terminal, clique no botão iniciar do Windows e procure por “Microsoft Windows SDK v?.??”. Onde ?.?? é a versão da SDK que você instalou, clicando deve surgir um atalho para Cmd Shell, clique nele e você terá seu terminal aberto. É importante lembrar que é fundamental usar o terminal da SDK, apesar de ser quase idêntico ao terminal padrão do Windows, ele já vem com o ambiente configurado para que o compilador do Visual C++ possa ser usado.

Com o terminal aberto, navegue até o diretório da biblioteca, no meu caso, a sequência de comandos: “d:” e depois cd libs\boost_147_0:

No diretório da biblioteca, bastão então digitar o comando “booststrap”, que irá analisar seu ambiente e preparar a biblioteca para compilação, ao final da execucão deve surgir uma tela semelhante a esta abaixo:

Agora a biblioteca esta pronta para ser compilada, basta então digitar o comando “b2” para que seja iniciado o longo processo de compilação:

Depois da espera toda a Boost esta pronta para ser usada. No final deve surgir algo semelhante a tela abaixo:

Mudando a Versão do Compilador

No meu computador existem duas versões do Visual C++ instaladas, além do mingw, caso você esteja nessa situação pode passar pelo desagrádavel problema do sistema de construção da biblioteca se confundir e nesse caso vai ser preciso dizer ao sistema que versão ou qual compilador usar. Para isso basta usar a opção –toolset, alguns exemplos:

  • b2 –toolset=msvc-9.0
  • b2 –toolset=msvc-10.0

Observe que existem dois “-“ (hifens) antes da opção toolset.

Configurando o Compilador

Até o momento, apenas construímos os binários da biblioteca, mas o Visual ainda nem sabe da presença dela, para isso é precisso configurar os diretórios de include e de biblioteca para que a Boost possa ser usada. Neste artigo não mostrarei como fazer isso, pois temos no PontoV dois artigos sobre o assunto:

Configurado o compilador e a IDE, a utilização da Boost é idêntica a de qualquer outra biblioteca, faça o include dos arquivos de cabeçalho que precisa e pronto. Detalhe que usando o Visual C++ não é preciso adicionar os arquivos lib as configurações do linker, pois isto vai ser feito automaticamente quando você der include dos arquivos da Boost.

Para facilitar o trabalho, ai vão os diretórios que devem ser adicionados a configuração do compilador:

  • include: “d:\libs\boost_1_47_0”, ou seja, o diretório onde foi instalado a biblioteca
  • bibliotecas (libs): “d:\libs\boost_1_47_0\stage\lib\”

Com estes poucos passos já é possível utilizar essa grande (em vários sentidos Smile )biblioteca no seu projeto!


Comentários (30)
  • Oseas  - Parabens
    avatar

    Ótimo artigo me ajudou muito, vc está de parabéns!

  • Carlos Eduardo
    avatar

    :woohoo: Gostei muito =)

  • Thomas
    avatar

    Aí, to querendo aprender C++ O Mais rápido possível, voce tem uma dica, de onde encontrar tutoriais completos e fáceis?

  • Roberto  - problema
    avatar

    Muito bom o post,

    Porém, seguindo todos os passos, nao to conseguindo fazer com que o visual reconheça alguns métodos do namespace boost, o que pode ser? :S

    obrigado!

  • Bruno Crivelari Sanches
    avatar

    bom, verifique se realmente esta correto o código, em todo caso, poste codigo com o menor exemplo possível do erro para poder lhe ajuda rmelhor.

  • Roberto
    avatar

    Sim,

    Com toda certeza o código está correto, porque em outras máquinas está compilando, o problema é com a biblioteca do boost msmo

    Engraçado é que ele acha os includes e namespace, porém este método nao reconhece. Segue exemplo:

    boost::uuids::uuid uuid = boost::uuids::random_generator()();
    string keyStr = boost::lexical_cast(uuid);

    a segunda linha gera o erro: namespace "boost" has no member "lexical_cast"

    Obrigado!

  • Bruno Crivelari Sanches
    avatar

    Bom, se o código todo tem que fazer a pergunta obvia: tem include ?

    Aqui da um erro no lexical cast mesmo, mas a impressão que tenho é que ele não suporta o uuid.

  • Roberto
    avatar

    Estive pensando, será que tem algo a ver com a arquitetura da minha máquina, que é 64 bits?

  • Bruno Crivelari Sanches
    avatar

    Não, não importa a arquitetura da sua maquina, importa a configuraçào do seu compilador. O compilador pode muito bem gerar código 64 bits em maquinas 32 bits. Ele não depende da maquina.

    Você pode não executar o codigo, mas gerar não tem problema.

    T+

  • Roberto
    avatar

    tem os includes, são esses:

    #include // uuid class
    #include // generators
    #include // streaming operators

  • Bruno Crivelari Sanches
    avatar

    E o lexical cast?

  • Roberto  - re:
    avatar

    rs, a pagina cortou aqui por causa do "

  • Bruno Crivelari Sanches
    avatar

    O codigo do link: http://notepad.cc/xuveopu39

    compilou perfeitamente aqui.

    T+

  • Roberto
    avatar

    Booaaaaa!

    Era isso msmo!

    Agr fica a duvida, pois este msmo código sem este include compilava em outras maquinas, rs.

    Muito Obrigado, abraço!

  • Bruno Crivelari Sanches
    avatar

    Pode ser versão diferente da boost ou alguma diferença de plataforma...

    T+

  • Anônimo
    avatar

    Oi Bruno Crivelari,

    Estou tentando Compilar a Boost utilizando Visual Studio 2011, Esta dando um erro quando que nao estou conseguindo identificar.
    O que eu tenho que fazer para corrigir esse erro?

    Setting SDK environment relative to C:\Program Files\Microsoft SDKs\Windows\v7.1
    \.
    Targeting Windows 7 x64 Debug

    C:\Program Files\Microsoft SDKs\Windows\v7.1>cd \

    C:\>cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\boost_1_47_0

    C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\boost_1_47_0>bootstrap

    Building Boost.Build engine
    Acesso negado.

    Failed to build Boost.Build engine.
    Please consult bootstrap.log for furter diagnostics.

    You can try to obtain a prebuilt binary from

    http://sf.net/project/showfiles.php?group_id=7586&package_id=72941

    Also, you can file an issue at http://svn.boost.org
    Please attach bootstrap.log in that case.

    C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\boost_1_47_0>


    Obrigado

  • alex vital
    avatar

    Corrigindo.

    Visual Studio 2010.

  • Anônimo
    avatar

    Você esta tentando fazer o build dentro do Program Files e dentro do diretório do Visual studio, eu acho isso uma pessiam ideia, crie uma pasta libs ou qualquer outra no seu sistema e concentre as bibliotecas por la, deixe o visual quietinho.

    A mensagem "acesso negado" já dizz tudo, usuário comum não tem permissão para alterar o program files, você tem que abrir um prompt como administrador para poder fazer isso.

  • alex vital
    avatar

    Oi bruno.

    Criei uma pasta C:\libs, dei um click com o botão direto no sdk abri como administrador.
    E deu o seguinte erro.

    Setting SDK environment relative to C:\Program Files\Microsoft SDKs\Windows\v7.1 \.Targeting Windows 7 x64 Debug

    C:\Windows\system32>cd \
    C:\>cd C:\Libs\boost_1_47_0

    C:\Libs\boost_1_47_0>bootstrap
    Building Boost.Build engine

    Failed to build Boost.Build engine.
    Please consult bootstrap.log for furter diagnostics.

    You can try to obtain a prebuilt binary from

    http://sf.net/project/showfiles.php?group_id=7586&package_id=72941

    Also, you can file an issue at http://svn.boost.org
    Please attach bootstrap.log in that case.


    E no log tem os seguintes erros:


    Setting environment for using Microsoft Visual Studio 2010 x86 tools.
    ###
    ### Using 'vc10' toolset.
    ###

    C:\Libs\boost_1_47_0\tools\build\v2\engine> if exist bootstrap rd /S /Q bootstrap

    C:\Libs\boost_1_47_0\tools\build\v2\engine> md bootstrap

    C:\Libs\boost_1_47_0\tools\build\v2\engine> cl /nologo /RTC1 /Zi /MTd /Fobootstrap/ /Fdbootstrap/ -DNT -DYYDEBUG -wd4996 kernel32.lib advapi32.lib user32.lib /Febootstrap\jam0 command.c compile.c debug.c execnt.c expand.c filent.c glob.c hash.c hdrmacro.c headers.c jam.c jambase.c jamgram.c lists.c make.c make1.c newstr.c option.c output.c parse.c pathunix.c regexp.c rules.c scan.c search.c subst.c timestamp.c variable.c modules.c strings.c filesys.c builtins.c md5.c pwd.c class.c w32_getreg.c native.c modules/set.c modules/path.c modules/regex.c modules/property-set.c modules/sequence.c modules/order.c
    command.c
    compile.c
    debug.c
    execnt.c
    expand.c
    filent.c
    glob.c
    hash.c
    hdrmacro.c
    headers.c
    jam.c
    jambase.c
    jamgram.c
    lists.c
    make.c
    make1.c
    newstr.c
    option.c
    output.c
    parse.c
    Generating Code...
    Compiling...
    pathunix.c
    regexp.c
    rules.c
    scan.c
    search.c
    subst.c
    timestamp.c
    variable.c
    modules.c
    strings.c
    filesys.c
    builtins.c
    md5.c
    pwd.c
    class.c
    w32_getreg.c
    native.c
    set.c
    path.c
    regex.c
    Generating Code...
    Compiling...
    property-set.c
    sequence.c
    order.c
    Generating Code...
    execnt.obj : error LNK2019: unresolved external symbol __imp__CreateProcessA@40 referenced in function _exec_cmd
    LIBCMTD.lib(popen.obj) : error LNK2001: unresolved external symbol __imp__CreateProcessA@40
    LIBCMTD.lib(dbgrptt.obj) : error LNK2019: unresolved external symbol __imp__GetStdHandle@4 referenced in function __VCrtDbgReportA
    execnt.obj : error LNK2001: unresolved external symbol __imp__GetStdHandle@4
    LIBCMTD.lib(wassert.obj) : error LNK2001: unresolved external symbol __imp__GetStdHandle@4
    LIBCMTD.lib(crt0msg.obj) : error LNK2001: unresolved external symbol __imp__GetStdHandle@4
    LIBCMTD.lib(ioinit.obj) : error LNK2001: unresolved external symbol __imp__GetStdHandle@4
    execnt.obj : error LNK2019: unresolved external symbol __imp__SetHandleInformation@12 referenced in function _exec_cmd
    execnt.obj : error LNK2019: unresolved external symbol __imp__CreatePipe@16 referenced in function _exec_cmd
    LIBCMTD.lib(pipe.obj) : error LNK2001: unresolved external symbol __imp__CreatePipe@16
    execnt.obj : error LNK2019: unresolved external symbol __imp__SetSecurityDescriptorDacl@16 referenced in function _exec_cmd
    execnt.obj : error LNK2019: unresolved external symbol __imp__InitializeSecurityDescriptor@8 referenced in function _exec_cmd
    execnt.obj : error LNK2019: unresolved external symbol __imp__Sleep@4 referenced in function _exec_cmd
    execnt.obj : error LNK2019: unresolved external symbol __imp__GetCurrentProcessId@0 referenced in function _exec_cmd
    pathunix.obj : error LNK2001: unresolved external symbol __imp__GetCurrentProcessId@0......
    ......
    ......
    ......
    .....
    ......

    OBRIGADO.

  • Anônimo
    avatar

    Eu nunca tive problemas com o booststrap, me parece que existe algum problema no seu ambiente, pois as funções que ele reclama de erro de linkagem estão em Kernel32.lib, que pela linha de comando foi incluído no build.

    Porque você não tenta com a versão mais recente do site?

  • Alex Vital
    avatar

    Tive que reinstalar o visual 10 depois segui o tutorial e deu certo.

    OBRIGADO, pelas dicas e pelo tutorial !!!!!!

  • Anônimo
    avatar

    Blz Alex!

  • Alex Vital
    avatar

    Tive que reinstalar o visual 10 depois segui o tutorial e deu certo.

    OBRIGADO pelas dicas e pelo tutorial !!!!!!

  • alex vital
    avatar

    Oi Bruno,

    Estou usando a versão da Boost 1_51_0, Visual Studio 2010 e o Python 2.6

    Fiz um pequeno teste para verificar a Boost_Python:

    #include "stdafx.h"
    #include
    #include


    char const* greet(){return "hello, word";}

    BOOST_PYTHON_MODULE(python_teste){
    using namespace boost::python;
    def("greet", greet);
    }

    E deu o seguinte erro.

    fatal error LNK1104:cannot open file "boost python-vc100-mt-1_51.lib"

    procurei no google e achei um site

    http://stackoverflow.com/questions/6890146/linking-to-boostpython-u sing-visual-c-express-10

    Para definir o BOOST_PYTHON_STATIC_LIB se quizer usar a libboost_*

    entao eu definir #define BOOST_PYTHON_STATIC_LIB

    e continuou dando o mesmo erro.Tb baixei um instalador com a BOOST já compilada e tb continua dando o mesmo erro.

    fatal error LNK1104:cannot open file "boost python-vc100-mt-1_51.lib"


    O que eu tenho que fazer para corrigir esse erro?


    Valeu.

  • Guilherme Fickel  - Problema ao compilar Boost
    avatar

    Opa, eu estava com um problema ao rodar o bootstrap para compilar o boost: ele não estava encontrando o meu compilador. Descobri como resolver aqui

    http://stackoverflow.com/que stions/84404/using-visual-studios-cl-from-a-normal-command-line/84431# 84431

    Tu apenas tem que acrescentar alguns caminhos ao PATH e criar outras duas variáveis de ambiente INCLUDE e LIB conforme mostrado no link. Aparentemente o Windows SDK não conseguiu encontrar sozinho os paths pro Visual Studio :pinch:

    Ah, e valeu pelo artigo! Me ajudou muito :D

  • Anônimo
    avatar

    Estranho, no link descreve apenas o caso do sujeito que quer compilar sem abrir o prompt do visual. O prompt do visual conforme descrito no artigo.

    Obrigado

  • Francisco Neto  - Prompt Visual Studio 2013
    avatar

    para que usa windows 8/8.1 com Visutal Studio 2013 o prompt de comando pode ser achado da seguinte forma:

    1 - Menu Iniciar (Tecla do windows)
    2 - DIgita Visual Studio
    3 - Clina na pasta que aparece
    4 - Seleciona o Prompt de Comando desejado (vai ter 3 versões para 3 plataformas diferentes: arm, x86 e x86_64).

  • Jacob  - Compilar Boost
    avatar

    Olá Pessoal,

    Estou tentando Compilar a Boost utilizando Visual Studio 2012, e esta ocorrendo um erro, e não sei o que pode ser, se alguém puder me dar
    uma mão, fico grato.
    segue o erro:


    C:\boost_1_59_0>bootstrap

    Building Boost.Build engine
    'cl' não é reconhecido como um comando interno
    ou externo, um programa operável ou um arquivo em lotes.

    Failed to build Boost.Build engine.
    Please consult bootstrap.log for further diagnostics.

    You can try to obtain a prebuilt binary from

    http://sf.net/project/showfiles.php?group_id=7586&package_id=72941< /p>

    Also, you can file an issue at http://svn.boost.org
    Please attach bootstrap.log in that case.

    C:\boost_1_59_0>

    Obrigado...

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter