erro fatal LNK1104: não é possível abrir o arquivo 'libboost_system-vc110-mt-gd-1_51.lib'

88

Parece que não consigo fazer isso funcionar. Fiz um aplicativo de console simples (que depende de websocket++biblioteca) que precisa de Boostbibliotecas .. mas quando tento compilar, obtenho:

erro fatal LNK1104: não é possível abrir o arquivo 'libboost_system-vc110-mt-gd-1_51.lib'

No entanto, fiz o bjam que criou a lib no (boost_root)/stage/libse vinculei o caminho das libs ao compilador C++/Additionnals includes.

Se eu olhar no (boost_root)/stage/libsarquivo libboost_system-vc110-mt-gd-1_51.libnão está lá. Em libboost_system-vc110-mt-sgd-1_51.libvez disso, é chamado .

Qualquer ideia?

Rushino
fonte
1
Consegui construir o arquivo libboost_system-vc110-mt-gd-1_51.lib fazendo uma compilação completa com bjam, mas ainda recebo o erro.
Rushino
21
Abra o VS2012 developer command prompt, vá para o diretório raiz boost e digite bootstrap, e então digite b2e você deve obter um conjunto completo de arquivos de biblioteca.
Jesse Good
Você adicionou os caminhos de inclusão e os caminhos do vinculador ao seu projeto?
Jesse Good
1
Você está construindo seu aplicativo com /MD?
Mahesh
Se puder
gorogm

Respostas:

93

O parâmetro C ++ → Geral → Diretórios de inclusão adicionais é para listar os diretórios onde o compilador irá procurar por arquivos de cabeçalho.

Você precisa dizer ao vinculador onde procurar bibliotecas para vincular. Para acessar esta configuração, clique com o botão direito do mouse no nome do projeto na janela do Solution Explorer , em seguida, Propriedades → Linker → Geral → Diretórios de biblioteca adicionais . Digite <boost_path>\stage\libaqui (este é o caminho onde as bibliotecas estão localizadas se você construir o Boost usando as opções padrão).

Pretoriano
fonte
você pode me explicar o que é boost_path
ggsmartboy
1
@ggsmartboy É o caminho onde estão os arquivos de origem do boost (o mesmo caminho que você lista no compilador inclui caminhos para que ele possa localizar os cabeçalhos do boost). A resposta assume que você mesmo construiu o boost (sem usar uma distribuição) usando as opções de construção padrão.
Pretoriano de
Impressionante. Me salvou de uma verdadeira dor de cabeça também. Por que eu não consegui identificar isso na documentação do boost (se é que está lá), eu não sei! :)
absentmindeduk
2
As configurações referidas nesta resposta são encontradas se você clicar com o botão direito do mouse no projeto e escolher propriedades (para novatos como eu, clicar com o botão direito na solução, ir para Ferramentas> Opções etc. Essas opções não estavam presentes em todos os meus projetos). VS2013
Mr_and_Mrs_D
1
@Mr_and_Mrs_D Você está certo, presumi que o leitor sabia dessa parte. Atualizada.
Pretoriano
94

Esta é a maneira mais simples para um amador como eu que está estudando C ++ por conta própria:

Primeiro descompacte a biblioteca boost para qualquer diretório de sua escolha. Eu recomendo c:\directory.

  1. Abra seu C ++ visual.
  2. Crie um novo projeto.
  3. Clique com o botão direito no projeto.
  4. Clique na propriedade.
  5. Clique em C / C ++.
  6. Clique em geral.
  7. Selecione a biblioteca de inclusão adicional.
  8. Inclui o destino da biblioteca. por exemplo c:\boost_1_57_0.
  9. Clique no cabeçalho do pré-compilador.
  10. Clique em criar / usar cabeçalho pré-compilado.
  11. Selecione não usar cabeçalho pré-compilado.

Em seguida, vá para a biblioteca de links onde você teve seus problemas.

  1. Vá para onde estava o arquivo extraído c:\boost_1_57_0.
  2. Clique em booststrap.bat(não se preocupe em digitar na janela de comando apenas espere e não feche a janela que é o local onde tive meu problema que levei duas semanas para resolver. Depois de um tempo, o booststrapserá executado e produzirá o mesmo arquivo, mas agora com dois nomes diferentes: b2e bjam.
  3. Clique em b2e espere para executar.
  4. Clique em bjame espere para executar. Em seguida, uma pasta será chamada de produção stage.
  5. Clique com o botão direito no projeto.
  6. Clique na propriedade.
  7. Clique no linker.
  8. Clique em geral.
  9. Clique em incluir diretório de biblioteca adicional.
  10. Selecione a parte da biblioteca, por exemplo c:\boost_1_57_0\stage\lib.

E você está pronto para ir!

Wu Jie
fonte
3
Muito obrigado Wu Jie - Eu nunca tinha feito nada parecido antes e essas etapas foram exatamente o que eu precisava para construir o Boost e produzir o arquivo de biblioteca 'libboost_serialization-vc140-mt-gd-1_57.lib' ausente que estava tendo problemas para vincular: )
Vixxd
5
Obrigado, eu gosto de boas instruções detalhadas. Para a etapa 2/3/4 da configuração do boost, o que fiz foi: a) abrir um prompt de linha de comando como root ; b) mude para o diretório boost_1_57_0; c) digite bootstrap.bat(demorou 10-20 segundos); d) digite ./b2conforme as instruções (demorava 30-40 minutos para ser concluído).
Darren Cook,
1
Tive que abrir bootstrap.bat usando o prompt de comando do Visual Studio, pois o prompt de comando normal não sabia como processar o comando 'cl'.
jlaverde
20/02/2018, sua solução funciona para mim (VS2017 + Boost 1,66). Muito obrigado.
CaTx de
Obrigado pelas etapas para iniciantes. Eu gostaria que todos sempre dessem respostas como você deu.
Mudit Jain
6

Eu tive o mesmo problema. Isso foi causado porque compilei o Boost com o Visual C ++ 2010 (v100) e tentei usar a biblioteca com o Visual Studio 2012 (v110) por engano.

Então, mudei as configurações (no Visual Studio 2012) indo para Propriedades do projeto -> Geral -> Conjunto de ferramentas da plataforma e alterei o valor do Visual Studio 2012 (v110) para o Visual Studio 2010 (v100) .

Jota Santos
fonte
7
Espero que você perceba que, ao alterar o conjunto de ferramentas da plataforma para usar o v100, está dizendo ao IDE do VS2012 para usar o compilador que acompanha o VS2010. Quaisquer recursos do C ++ 11 que foram adicionados ao compilador VS2012 não estarão disponíveis. Uma solução melhor é compilar o Boost usando o compilador VS2012; você pode ter as bibliotecas geradas de 2010 e 2012 coexistindo porque o Boost coloca o número da versão do compilador nos nomes dos arquivos de saída.
Pretoriano,
Você está certo e eu estou ciente. Tenho medo do que possa acontecer se eu atualizar as bibliotecas e o compilador. Então, quando o projeto terminar, vou consertar tudo isso. Obrigado!
Jota Santos
6

Mais uma solução:

Fiquei perplexo porque estava incluindo boost_regex-vc120-mt-gd-1_58.lib em minha propriedade Link-> Dependências Adicionais, mas o link dizia que não conseguia abrir libboost_regex-vc120-mt-gd-1_58.lib ( observe o prefixo lib). Eu não especifiquei libboost_regex-vc120-mt-gd-1_58.lib.

Eu estava tentando usar (e tinha construído) as bibliotecas dinâmicas de impulso (.dlls), mas não tinha a macro BOOST_ALL_DYN_LINK definida. Aparentemente, há dicas na compilação para incluir uma biblioteca, e sem BOOST_ALL_DYN_LINK ele procura a biblioteca estática (com o prefixo lib), não a biblioteca dinâmica (sem um prefixo lib).

wdtj
fonte
Ainda apenas 1 voto positivo, mas eu me encontro aqui a cada poucos meses, sendo lembrado novamente qual é a solução para o meu problema !!
Neil Gatenby
3

Tive o mesmo problema e meu erro foi ter instalado o binário boost_1_55_0-msvc-11.0-32.exe para usar com o visual c ++ 2010 que tem a versão v100 (propriedades do projeto-> ConfiguratioProperties-> Geral-> platformTooset) não v110 como visual c ++ 2012. Então baixei boost_1_55_0-msvc-10.0-32.exe e agora está tudo ok até agora.

Plínio
fonte
2

Caso você tenha problemas para criar boost ou prefira não fazer isso, uma alternativa é baixar os arquivos lib do SourceForge . O link o levará a uma pasta de arquivos lib e dll compactados para a versão 1.51. Porém, você deve ser capaz de editar o link para especificar a versão de sua escolha. Aparentemente, o instalador do BoostPro tem alguns problemas.

Bob Bryan
fonte
2

Tive um problema semelhante ao tentar usar o teste de unidade de impulso no Visual Studio 2015 (Community Edition):

erro fatal LNK1104: libboost_unit_test_framework-vc140-mt-1_57

então pensei em compartilhar minha solução.

Você pode criar um projeto de teste de unidade de impulso de duas maneiras (e esta solução funciona para ambas):

  1. usando o adaptador de teste da unidade de reforço
  2. ou criando um aplicativo de console Win32 ( etapas aqui ) e substituindo a função principal por uma função de teste de unidade de reforço ( etapas aqui ).

Aqui estão as etapas que segui para fazer os dois projetos funcionarem:

Primeiro, baixe a versão boost desejada (por exemplo, boost_1_57_0 ). Você pode baixar o boost com os binários corretos (compilados usando msvc v140) ou extrair os binários você mesmo executando os seguintes comandos na linha de comando:

  1. bootstrap.bat
  2. "C: \ Arquivos de programas (x86) \ Microsoft Visual Studio 14.0 \ VC \ vcvarsall.bat" x86
  3. bjam --clean
  4. bjam -j4 --debug-symbols = on --build-type = complete toolset = msvc-14.0 threading = multi runtime-link = shared address-model = 32

Onde msvc-14.0 especifica que exigimos a versão do Visual Studio 2015 (VS 2015 = v14.0 = v140) e address-model = 32 especifica que exigimos a plataforma 32 (mas o mesmo pode ser feito para 64 bits).

Depois de ter os binários, vá para o Visual Studio, selecione o projeto Boost Unit Testing que você criou. Acesse Propriedades do projeto> configuração (no menu principal) e faça as seguintes escolhas:

  • Defina " Geral> Conjunto de ferramentas da plataforma " para Visual Studio 2015 (v140).

  • Inclua o caminho para a pasta boost (por exemplo, C: \ boost_1_57_0) e o caminho para a subpasta contendo os arquivos binários (por exemplo, C: \ boost_1_57_0 \ stage \ lib) em:

    • " C \ C ++> Diretório de inclusão adicional "
    • e " Linker> Diretórios de biblioteca adicionais ".
Aciel
fonte
1

b2 -j% cores% toolset =% msvcver% address-model = 64 arquitetura = x86 link = static threading = multi runtime-link = compartilhado --build-type = mínimo stage --stagedir = stage / x64

Propriedades → Linker → Geral → Diretórios de biblioteca adicionais $ (BOOST) \ stage \ x64 \ lib

Dmitry Ivanov
fonte
Um pouco mais de elaboração sobre o que essas linhas estão fazendo e por que -> ajudaria a melhorar a qualidade dessa resposta.
Anton Menshov
0

Eu tive o mesmo problema relatado aqui. Resolvi o problema ao mover mainTest.cpp de uma subpasta src / mainTest / para a pasta principal src / Acho que esse também era o seu problema.

fiorentinoing
fonte
0

2>LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc120-mt-sgd-1_55.lib

No meu caso, bootstrap / bjam não estava disponível (bibliotecas foram pré-compiladas e comprometidas com SCM) no antigo projeto herdado. As bibliotecas não tinham controle de versão VC ou BOOST em seus nomes de arquivo, por exemplo:, no libboost_regex-mt-sgd.libentanto, Processed /DEFAULTLIB:libboost_regex-vc120-mt-sgd-1_55.libera de alguma forma acionado automaticamente.

Corrigido adicionando manualmente o nome do arquivo sem versão a:

<AdditionalDependencies>$(DK_BOOST)\lib64\libboost_regex-mt-sgd.lib</AdditionalDependencies>

e na lista negra do ...vc120-mt-sgd-1_55.libno

<IgnoreSpecificDefaultLibraries>libboost_regex-vc120-mt-sgd-1_55.lib</IgnoreSpecificDefaultLibraries>
kevinf
fonte