Как мне разрешить ошибку LNK1104 с помощью библиотеки файловой системы Boost в MSCV?

У меня возникли проблемы с подключением моего проекта к файлу libost файловой системы Boost (версия 1.37.0) в Microsoft Visual С++ 2008 Express Edition. Библиотека файловой системы not библиотека только для заголовков. Я следил за Руководство для начинающих в Windows, размещенном на официальной веб-странице повышения. Вот шаги, которые я предпринял:

  • Я использовал bjam для создания полного набора файлов lib, используя:

    bjam --build-dir="C:\Program Files\boost\build-boost" --toolset=msvc --build-type=complete
    
  • Я скопировал каталог /libs (расположенный в C:\Program Files\boost\build-boost\boost\bin.v2) до C:\Program Files\boost\boost_1_37_0\libs.

  • В Visual С++ в разделе Проект > Свойствa > Дополнительные каталоги библиотек Я добавил эти пути:

    • C:\Program Files\boost\boost_1_37_0\libs
    • C:\Program Files\boost\boost_1_37_0\libs\filesystem\build\msvc-9.0express\debug\link-static\threading-multi

    Я добавил второй из отчаяния. Это точная директория, в которой находится libboost_system-vc90-mt-gd-1_37.lib.

  • В Свойства конфигурации > C/С++ > Общие > Дополнительные каталоги Include Я добавил следующий путь:

    • C:\Program Files\boost\boost_1_37_0
  • Затем, чтобы поместить глазурь на торт, в разделе Инструменты > Опции VС++ Каталоги > Библиотечные файлы, я добавил те же каталоги, упомянутые на шаге 3.

Несмотря на все это, когда я создаю свой проект, я получаю следующую ошибку:

fatal error LNK1104: cannot open file 'libboost_system-vc90-mt-gd-1_37.lib'

Кроме того, вот код, который я пытаюсь скомпилировать, а также скриншот из вышеперечисленного каталога, где находится (предположительно правильный) файл lib:

#include "boost/filesystem.hpp"   // includes all needed Boost.Filesystem declarations
#include <iostream>               // for std::cout
using boost::filesystem;          // for ease of tutorial presentation;
                                  //  a namespace alias is preferred practice in real code

using namespace std;

int main()
{
    cout << "Hello, world!" << endl;

    return 0;
}

Ответ 1

Ответ Ферруччио содержит большую часть проницательности. Однако Пукку заставил меня понять мою ошибку. Я отправляю свой собственный ответ, чтобы дать полное объяснение. Как объяснил Ферруччио, файловая система опирается на две библиотеки. Для меня это:

  • libboost_system-vc90-мт-Г.Д.-1_37.lib
  • libboost_filesystem-vc90-мт-Г.Д.-1_37.lib

Я не должен был замечать, что когда я предоставил каталог для libboost_filesystem-vc90-mt-gd-1_37.lib, выход ошибки изменился с

fatal error LNK1104: cannot open file 'libboost_filesystem-vc90-mt-gd-1_37.lib'

к

fatal error LNK1104: cannot open file 'libboost_system-vc90-mt-gd-1_37.lib'

Мне кажется, что ошибка сохраняется. Это привело меня к публикации некоторой довольно неточной информации. Кроме того, после чтения, что для файловой системы требуются две библиотеки, теперь я вижу значение ключевого слова stage для команды bjam. Поставляя

bjam --build-dir="C:\Program Files\boost\build-boost" --toolset=msvc --build-type=complete stage

Заставляет bjam поместить дополнительный каталог, метко названный stage, в каталог boost_1_37_0. Эта папка содержит папку с именем /lib, в которой есть копии всех файлов lib в одном месте. Это удобно для Visual С++, потому что вы можете предоставить его с помощью этой единственной директории, и она позаботится обо всех зависимостях.

Ответ 2

boost:: filesystem зависит от boost:: system, поэтому вам нужны оба пути.

Частично проблема заключается в том, что вы используете ускоряющие libs из каталогов сборки вместо установочного каталога (процесс сборки boost должен создавать оба). В каталоге install/lib есть все библиотеки, поэтому вам нужно указать только один путь.

Процесс сборки boost создает каждую библиотеку в своем собственном каталоге. В конце он копирует все эти .lib файлы в один общий каталог lib.

Поскольку вы не указали каталог установки как часть вашей команды сборки (с -prefix =...), я считаю, что по умолчанию это C:\Boost. Проверьте, есть ли этот каталог, и если да, используйте C:\boost\include\boost-1_37 для вашего пути include и C:\boost\lib для вашего пути к библиотеке.

Ответ 3

Я думаю, что настоящая оригинальная проблема связана с процессом сборки по умолчанию в Windows, который ожидает статического связывания библиотеки, которая будет иметь имя beginning libboost_sytem<etc..>. Необходимый макрос

#define BOOST_SYSTEM_DYN_LINK

что гарантирует, что библиотека Boost.System динамически связана. Имя динамической библиотеки boost_system<etc...>, как и статическая библиотека libboost_sytem<etc...>

Ответ 4

Последний ответ правильный. Но вы должны найти форматированный файл $BOOST\config\user.hpp и раскомментируйте эту директиву #define BOOST_ALL_DYN_LINK. Теперь он начинает использовать динамическую связь с boost и должен работать.

Ответ 5

Ошибка, которую вы опубликовали, жалуется на файл libboost_system-vc90-mt-gd-1_37.lib, но в каталоге у вас есть только libboost_filesystem-vc90-mt-gd-1_37.lib, правильно?

Посмотрите на libboost_system-vc90-mt-gd-1_37.lib. Если вы его найдете, добавьте соответствующий каталог в путь поиска библиотеки. Если вы его не нашли, посмотрите, есть ли у вас boost_system-vc90-mt-gd-1_37.lib(как и я) и попробуйте скопировать его в желаемое имя файла.

Ответ 6

Командная строка bjam должна иметь все версии всех библиотек. Тем не менее, когда вы создаете с помощью

bjam --build-dir="C:\Program Files\boost\build-boost" --toolset=msvc --build-type=complete stage

(обратите внимание на stage в конце) все библиотеки копируются в общую папку libs/, так что функция автозапуска MSVC работает, когда вы добавляете эту папку libs/в свой путь к библиотеке.

Я не знаю, будет ли bjam без stage копировать все эти файлы в одну папку. Если нет, выполните такую ​​конструкцию stage, чтобы сделать это. Если они, ну, извините, конфигурация кажется правильной, возможно, небольшая ошибка ввода?

Ответ 7

У меня была такая же проблема, что вам нужно сделать, это добавить каталог "lib" под папкой повышения верхнего уровня в путь библиотеки в Visual С++.

Это определенно решило проблему для меня.