фатальная ошибка LNK1104: невозможно открыть файл libboost_system-vc110-mt-gd-1_51.lib

88

Кажется, я не могу заставить это работать. Я сделал простое консольное приложение (которое зависит от websocket++библиотеки), которому нужны Boostбиблиотеки ... но когда я пытаюсь скомпилировать, я получаю:

фатальная ошибка LNK1104: невозможно открыть файл libboost_system-vc110-mt-gd-1_51.lib

Однако я сделал bjam, который создал библиотеку, (boost_root)/stage/libsи связал путь к библиотекам с компилятором C++/Additionnals includes.

Если я посмотрю в (boost_root)/stage/libsфайл, то libboost_system-vc110-mt-gd-1_51.libего нет. Он называется libboost_system-vc110-mt-sgd-1_51.libвместо этого.

Любая идея?

Рушино
источник
1
Мне удалось создать файл libboost_system-vc110-mt-gd-1_51.lib, выполнив полную сборку с помощью bjam, однако я все еще получаю ошибку.
Рушино
22
Откройте VS2012 developer command prompt, перейдите в корневой каталог boost и введите bootstrap, а затем введите, b2и вы должны получить полный набор файлов библиотеки.
Джесси Гуд,
Вы добавили в проект пути включения и пути компоновщика?
Джесси Гуд,
1
Вы создаете свое приложение с помощью /MD?
Махеш
Если можно скачать вместо компиляции, скачайте
библиотеки

Ответы:

93

Параметр C ++ → General → Additional Include Directories предназначен для перечисления каталогов, в которых компилятор будет искать файлы заголовков.

Вам нужно указать компоновщику, где искать библиотеки для ссылки. Чтобы получить доступ к этому параметру, щелкните правой кнопкой мыши имя проекта в окне обозревателя решений , затем выберите Свойства → Компоновщик → Общие → Дополнительные каталоги библиотек . Введите <boost_path>\stage\libсюда (это путь, по которому расположены библиотеки, если вы собираете Boost с параметрами по умолчанию).

Преторианец
источник
Можете
ли
1
@ggsmartboy Это путь к исходным файлам повышения (тот же путь, который вы указываете в компиляторе, включает пути, чтобы он мог найти заголовки повышения). Ответ предполагает, что вы создали Boost самостоятельно (не используя дистрибутив), используя параметры сборки по умолчанию.
Преторианец,
Потрясающие. Также избавил меня от настоящей головной боли. Я не знаю, почему я не смог найти это в документации по бусту (если она вообще есть)! :)
absentmindeduk
2
Параметры, упомянутые в этом ответе, можно найти, если щелкнуть проект правой кнопкой мыши и выбрать свойства (для таких новичков, как я, щелкнуть правой кнопкой мыши решение, перейти в Инструменты> Параметры и т. Д. Эти параметры не присутствовали во всех моих проектах). VS2013
Mr_and_Mrs_D
1
@Mr_and_Mrs_D Вы правы, я предполагал, что читатель знает эту часть. Обновлено.
Praetorian
97

Это самый простой способ для такого любителя, как я, который самостоятельно изучает C ++:

Сначала разархивируйте библиотеку boost в любой каталог по вашему выбору. Рекомендую c:\directory.

  1. Откройте свой визуальный C ++.
  2. Создайте новый проект.
  3. Щелкните проект правой кнопкой мыши.
  4. Щелкните свойство.
  5. Щелкните C / C ++.
  6. Щелкните "Общие".
  7. Выберите дополнительную включаемую библиотеку.
  8. Включите место назначения библиотеки. напр c:\boost_1_57_0.
  9. Щелкните заголовок прекомпилятора.
  10. Нажмите на создать / использовать предварительно скомпилированный заголовок.
  11. Выберите не использовать предварительно скомпилированный заголовок.

Затем перейдите в библиотеку ссылок, если у вас возникли проблемы.

  1. Перейти к тому, где был извлеченный файл c:\boost_1_57_0.
  2. Нажмите booststrap.bat(не пытайтесь вводить текст в командном окне, просто подождите и не закрывайте окно, в котором у меня возникла проблема, решение которой заняло у меня две недели. Через некоторое время программа booststrapзапустится и создаст тот же файл, но теперь с двумя разными именами:, b2и bjam.
  3. Нажмите b2и подождите, пока он запустится.
  4. Нажмите bjamи подождите, пока он запустится. Тогда будет производиться папка с именем stage.
  5. Щелкните проект правой кнопкой мыши.
  6. Щелкните свойство.
  7. Щелкните ссылку.
  8. Щелкните "Общие".
  9. Щелкните включить дополнительную библиотеку.
  10. Выберите часть библиотеки, например c:\boost_1_57_0\stage\lib.

И вам хорошо!

У Цзе
источник
3
Большое спасибо, Ву Цзе - я никогда раньше не делал ничего подобного, и эти шаги были именно тем, что мне нужно для создания Boost и создания недостающего файла библиотеки libboost_serialization-vc140-mt-gd-1_57.lib, у меня возникли проблемы с линковкой: )
Vixxd
5
Спасибо, нравятся красивые подробные инструкции. На шаге 2/3/4 настройки ускорения я сделал следующее: а) открыл командную строку как root ; б) перейти в каталог boost_1_57_0; в) тип bootstrap.bat(прошло 10-20 секунд); г) введите ./b2в соответствии с инструкциями (на это ушло 30-40 минут).
Даррен Кук
1
Мне пришлось открыть bootstrap.bat с помощью командной строки Visual Studio, поскольку обычная командная строка не знала, как обрабатывать команду cl.
jlaverde
20.02.2018, у меня работает ваше решение (VS2017 + Boost 1.66). Огромное спасибо.
CaTx
Спасибо за шаги для новичков. Я желаю, чтобы все всегда давали такие ответы, как вы.
Mudit Jain
6

У меня такая же проблема. Это было вызвано тем, что я скомпилировал Boost с Visual C ++ 2010 (v100) и по ошибке попытался использовать библиотеку с Visual Studio 2012 (v110).

Итак, я изменил конфигурации (в Visual Studio 2012), перейдя в Свойства проекта -> Общие -> Набор инструментов Plataform, и изменил значение с Visual Studio 2012 (v110) на Visual Studio 2010 (v100) .

Хота Сантос
источник
7
Надеюсь, вы понимаете, что, когда вы меняете набор инструментов платформы для использования v100, вы говорите IDE VS2012 использовать компилятор, поставляемый с VS2010. Любые функции C ++ 11, добавленные в компилятор VS2012, будут недоступны. Лучшее решение - скомпилировать Boost с помощью компилятора VS2012; у вас могут сосуществовать сгенерированные библиотеки как 2010, так и 2012 года, потому что Boost помещает номер версии компилятора в имена выходных файлов.
Praetorian
Вы правы, и я в курсе. Боюсь, что может случиться, если я обновлю библиотеки и компилятор. Итак, когда проект будет завершен, я все это исправлю. Благодарность!
Jota Santos
6

Еще одно решение:

Я был в тупике, потому что включал boost_regex-vc120-mt-gd-1_58.lib в свое свойство Link-> Additional Dependencies, но ссылка продолжала сообщать мне, что не может открыть libboost_regex-vc120-mt-gd-1_58.lib ( обратите внимание на префикс lib). Я не указал libboost_regex-vc120-mt-gd-1_58.lib.

Я пытался использовать (и построил) динамические библиотеки boost (.dll), но не определил макрос BOOST_ALL_DYN_LINK. Очевидно, в компиляции есть подсказки для включения библиотеки, и без BOOST_ALL_DYN_LINK он ищет статическую библиотеку (с префиксом lib), а не динамическую библиотеку (без префикса lib).

wdtj
источник
По-прежнему только 1 голос, но я оказываюсь здесь каждые несколько месяцев, и мне снова напоминают, как решить мою проблему !!
Нил
3

У меня была такая же проблема, и моя ошибка заключалась в том, что я установил двоичный файл boost_1_55_0-msvc-11.0-32.exe для использования с Visual C ++ 2010, который имеет версию v100 (свойства проекта-> ConfiguratioProperties-> General-> platformTooset), а не v110 как visual c ++ 2012. Я загрузил boost_1_55_0-msvc-10.0-32.exe, и теперь все в порядке.

Плинио
источник
2

Если у вас возникли проблемы со сборкой Boost или вы предпочитаете этого не делать, альтернативой является загрузка файлов библиотеки из SourceForge . По ссылке вы попадете в папку с заархивированными файлами lib и dll для версии 1.51. Но вы должны иметь возможность редактировать ссылку, чтобы указать версию по выбору. Видимо у установщика от BoostPro есть проблемы.

Боб Брайан
источник
2

У меня была аналогичная проблема при попытке использовать ускоренное модульное тестирование в Visual Studio 2015 (Community Edition):

фатальная ошибка LNK1104: libboost_unit_test_framework-vc140-mt-1_57

поэтому я подумал, что поделюсь своим решением.

Вы можете создать проект ускоренного модульного тестирования двумя способами (и это решение работает для обоих):

  1. с помощью адаптера для тестирования Boost Unit
  2. или путем создания консольного приложения Win32 ( шаги здесь ) и замены основной функции на функцию модульного тестирования boost ( шаги здесь ).

Вот шаги, которые я выполнил, чтобы оба проекта заработали:

Сначала загрузите желаемую версию boost (например, boost_1_57_0 ). Вы можете либо загрузить boost с правильными двоичными файлами (скомпилированными с использованием msvc v140), либо извлечь двоичные файлы самостоятельно, выполнив следующие команды из командной строки:

  1. bootstrap.bat
  2. «C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ vcvarsall.bat» x86
  3. bjam - чистый
  4. bjam -j4 --debug-symbols = on --build-type = complete toolset = msvc-14.0 threading = multi runtime-link = shared address-model = 32

Где msvc-14.0 указывает, что нам требуется версия Visual Studio 2015 (VS 2015 = v14.0 = v140), а address-model = 32 указывает, что нам требуется платформа 32 (но то же самое можно сделать для 64-разрядной версии).

Когда у вас есть двоичные файлы, перейдите в Visual Studio, выберите созданный вами проект Boost Unit Testing. Перейдите в Свойства проекта> конфигурация (из главного меню) и сделайте следующие варианты:

  • Установите « Общие> Набор инструментов платформы » на Visual Studio 2015 (v140).

  • Включите путь к папке boost (например, C: \ boost_1_57_0) и путь к подпапке, содержащей двоичные файлы (например, C: \ boost_1_57_0 \ stage \ lib) в:

    • " C \ C ++> Дополнительный каталог для включения "
    • и « Компоновщик> Дополнительные каталоги библиотек ».
Aciel
источник
1

b2 -j% cores% toolset =% msvcver% address-model = 64 architecture = x86 link = static threading = multi runtime-link = shared --build-type = minimal stage --stagedir = stage / x64

Свойства → Компоновщик → Общие → Дополнительные каталоги библиотек $ (BOOST) \ stage \ x64 \ lib

Дмитрий Иванов
источник
Более подробная информация о том, что делают эти строки и почему -> поможет улучшить качество этого ответа.
Антон Меньшов
0

У меня здесь была такая же проблема. Я решил проблему, переместив mainTest.cpp из подпапки src / mainTest / в основную папку src /, думаю, это тоже была ваша проблема.

Fiorentinoing
источник
0

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

В моем случае bootstrap / bjam был недоступен (библиотеки были предварительно скомпилированы и зафиксированы в SCM) в старом унаследованном проекте. В именах файлов библиотек не было версий VC или BOOST, например: libboost_regex-mt-sgd.libоднакоProcessed /DEFAULTLIB:libboost_regex-vc120-mt-sgd-1_55.lib каким-то образом запускались автоматически.

Исправлено путем ручного добавления имени файла без версии в:

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

и занесен в черный список ...vc120-mt-sgd-1_55.libин

<IgnoreSpecificDefaultLibraries>libboost_regex-vc120-mt-sgd-1_55.lib</IgnoreSpecificDefaultLibraries>
Кевинф
источник